Swift 迅速关闭的问题
我在从闭包中检索数据时遇到问题。我正在调用名为Swift 迅速关闭的问题,swift,parse-platform,closures,Swift,Parse Platform,Closures,我在从闭包中检索数据时遇到问题。我正在调用名为getwallmages的函数,该函数应该返回一个数组。我可以从闭包内部打印数组的内容,但在闭包外部,数组是空的 import Foundation import Parse class WallPostQuery { var result = [WallPost]() func getWallImages() -> [WallPost] { let query = WallPost.query()!
getwallmages
的函数,该函数应该返回一个数组。我可以从闭包内部打印数组的内容,但在闭包外部,数组是空的
import Foundation
import Parse
class WallPostQuery {
var result = [WallPost]()
func getWallImages() -> [WallPost] {
let query = WallPost.query()!
query.findObjectsInBackgroundWithBlock { objects, error in
if error == nil {
if let objects = objects as? [WallPost] {
self.result = objects
//This line will print the three PFObjects I have
println(self.result)
}
}
}
//this line prints [] ...empty array?
println(result)
return self.result
}
}
问题:
如何从闭包中获取值?发生的情况是,该方法在闭包执行之前返回 从根本上说,您在管理异步回调的方式上遇到了问题 您需要创建一种从闭包中通知调用方的方法。您可以通过以下方式实现:要求您自己的闭包作为输入参数;使用委托模式;使用通知
每种方法都有其优缺点,这取决于您的具体情况。开始异步数据获取的最简单方法是传入自己的闭包。从那里,如果需要,您可以跳转到另一个模式,例如委托模式。发生的是,该方法在闭包执行之前返回 从根本上说,您在管理异步回调的方式上遇到了问题 您需要创建一种从闭包中通知调用方的方法。您可以通过以下方式实现:要求您自己的闭包作为输入参数;使用委托模式;使用通知
每种方法都有其优缺点,这取决于您的具体情况。开始异步数据获取的最简单方法是传入自己的闭包。如果需要,您可以从那里跳转到另一个模式,例如委托模式。这是因为
println(result)
在self.results=objects
之前执行。闭包是异步执行的,因此它随后执行。尝试创建一个使用可以从闭包中调用的结果的函数:
var result = [WallPost]()
func getWallImages() {
let query = WallPost.query()!
query.findObjectsInBackgroundWithBlock { objects, error in
if error == nil {
if let objects = objects as? [WallPost] {
self.result = objects
//This line will print the three PFObjects I have
println(self.result)
self.useResults(self.result)
}
}
}
}
func useResults(wallPosts: [WallPost]) {
println(wallPosts)
}
}
问题的另一个解决方案是创建自己的闭包,以便从该函数返回:
var result = [WallPost]()
func getWallImages(completion: (wallPosts: [WallPost]?) -> ()) {
let query = WallPost.query()!
query.findObjectsInBackgroundWithBlock { objects, error in
if error == nil {
if let objects = objects as? [WallPost] {
self.result = objects
//This line will print the three PFObjects I have
println(self.result)
completion(wallPosts: self.result)
} else {
completion(wallPosts: nil)
}
} else {
completion(wallPosts: nil)
}
}
}
func useResults(wallPosts: [WallPost]) {
println(wallPosts)
}
}
这是因为
println(result)
在self.results=objects
之前执行。闭包是异步执行的,因此它随后执行。尝试创建一个使用可以从闭包中调用的结果的函数:
var result = [WallPost]()
func getWallImages() {
let query = WallPost.query()!
query.findObjectsInBackgroundWithBlock { objects, error in
if error == nil {
if let objects = objects as? [WallPost] {
self.result = objects
//This line will print the three PFObjects I have
println(self.result)
self.useResults(self.result)
}
}
}
}
func useResults(wallPosts: [WallPost]) {
println(wallPosts)
}
}
问题的另一个解决方案是创建自己的闭包,以便从该函数返回:
var result = [WallPost]()
func getWallImages(completion: (wallPosts: [WallPost]?) -> ()) {
let query = WallPost.query()!
query.findObjectsInBackgroundWithBlock { objects, error in
if error == nil {
if let objects = objects as? [WallPost] {
self.result = objects
//This line will print the three PFObjects I have
println(self.result)
completion(wallPosts: self.result)
} else {
completion(wallPosts: nil)
}
} else {
completion(wallPosts: nil)
}
}
}
func useResults(wallPosts: [WallPost]) {
println(wallPosts)
}
}
我认为println(result)的后一个在前面被调用,因为findobjectsinbackgroundithblock是在后台执行的,顾名思义 因此,您可以通过以下方式确认结果:
import Foundation
import Parse
class WallPostQuery {
var result = [WallPost]() {
didSet {
println(result)
}
}
func getWallImages() {
let query = WallPost.query()!
query.findObjectsInBackgroundWithBlock { objects, error in
if error == nil {
if let objects = objects as? [WallPost] {
self.result = objects
//This line will print the three PFObjects I have
println(self.result)
}
}
}
}
}
我认为println(result)的后一个在前面被调用,因为findobjectsinbackgroundithblock是在后台执行的,顾名思义 因此,您可以通过以下方式确认结果:
import Foundation
import Parse
class WallPostQuery {
var result = [WallPost]() {
didSet {
println(result)
}
}
func getWallImages() {
let query = WallPost.query()!
query.findObjectsInBackgroundWithBlock { objects, error in
if error == nil {
if let objects = objects as? [WallPost] {
self.result = objects
//This line will print the three PFObjects I have
println(self.result)
}
}
}
}
}