数组使用Parse重新调整PFQuery外部的空白数组。

数组在PFQuery外部返回一个空数组。 由于某种原因,这些项在编译时没有传递给数组。

class DriverViewController: UIViewController { var placesArr : Array = [] override func viewDidLoad() { super.viewDidLoad() self.window = UIWindow(frame: UIScreen.mainScreen().bounds) var query = PFQuery(className:"places") query.whereKey("username", equalTo:"email@email.com") query.findObjectsInBackgroundWithBlock { (objects: [AnyObject]?, error: NSError?) -> Void in if error == nil { println("Successfully retrieved \(objects!.count) scores.") if let objects = objects as? [PFObject] { for object in objects { let x = Place(aIdent: (object["Ident"] as! Int), aName: (object["name"] as! String), aAddress: (object["originAddress"] as! String), aCity: (object["originCity"] as! String), aCategoryName: (object["catName"] as! String), aLat: (object["aLat"] as! String), aLng: (object["aLng"] as! String)) self.placesArr.append(x) println(placesArr) //****It works here and prints an array**** } } } else { // Log details of the failure println("Error: \(error!) \(error!.userInfo!)") } } println(placesArr) //****But here it returns a blank array and this is where I need it to return an array**** 

这是一个与线程有关的常见误解,问题在于订单事件的运行情况:

 // Runs 1st query.findObjectsInBackgroundWithBlock { (objects: [AnyObject]?, error: NSError?) -> Void in // Runs 3rd } // Runs 2nd println(placesArr) 

当你调用findObjectsInBackground ,程序的执行不会停止,它会找到对象: inBackground ,这意味着将网络请求的繁重提升分派到不同的队列,这样用户仍然可以与屏幕进行交互。 一个简单的方法是:

 var placesArray: [Place] = [] { didSet { // Do any execution that needs to wait for places array here. } } 

您还可以在解析响应块中触发后续操作,我个人发现依赖于在didSet中执行的属性更新的执行行为是一种控制流的好方法。

洛根的回答恰到好处。

请参阅此主题中的答案: 在completionHandlers中存储值 – Swift

我写了一个关于异步完成处理程序如何工作的详细描述,并在注释中有一个指向工作示例项目的链接。

query.findObjectsInBackgroundWithBlock是一个在后台执行的块操作 – 它是异步的。

println(placesArr)实际上在块完成之前执行 – 这就是你在那里看到nil的原因。