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

Ios 数组使用Parse在PFQuery外部重新调整空白数组。,ios,arrays,swift,parse-platform,pfquery,Ios,Arrays,Swift,Parse Platform,Pfquery,数组在PFQuery之外时返回空白数组。由于某些原因,编译时不会将项传递给数组 class DriverViewController: UIViewController { var placesArr : Array<Place> = [] override func viewDidLoad() { super.viewDidLoad() self.window = UIWindow(frame: UIScreen.mainScreen().bounds)

数组在PFQuery之外时返回空白数组。由于某些原因,编译时不会将项传递给数组

class DriverViewController: UIViewController {
var placesArr : Array<Place> = []


    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****
class-DriverViewController:UIViewController{
变量placesArr:Array=[]
重写func viewDidLoad(){
super.viewDidLoad()
self.window=UIWindow(框架:UIScreen.mainScreen().bounds)
var query=PFQuery(类名:“地点”)
query.whereKey(“用户名”,等同于:email@email.com")
query.findObjectsInBackgroundWithBlock{
(objects:[AnyObject]?,错误:NSError?->Void in
如果错误==nil{
println(“已成功检索\(objects!.count)分数。”)
如果让对象=对象为?[PFObject]{
对于对象中的对象{
设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)//****它在这里工作并打印数组****
}
}
}否则{
//记录故障的详细信息
println(“错误:\(错误!)\(错误!.userInfo!)”)
}
}
println(placesArr)//**,但在这里它返回一个空白数组,这是我需要它返回数组的地方****

查询。findObjectsInBackgroundWithBlock是一个在后台执行的块操作,它是异步的


println(placesArr)
实际上是在块完成之前执行的-这就是为什么您在那里看到
nil

这是与线程相关的一个非常常见的误解,问题是事件运行的顺序:

// 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.
    }
}

您还可以在parse-response块中触发后续操作,我个人认为执行行为依赖于在
didSet
中执行的属性更新,这是控制流的好方法。

Logan的答案是正确的

请参见我在本帖中的答案:


我详细描述了异步完成处理程序是如何工作的,在评论中有一个链接指向一个工作示例项目,该项目对此进行了说明。

我觉得我每天都在做这些事情,比如昨天的这一次。我以为你已经就此写了一个通用的问题和答案,但找不到它作为参考。比ks Logan!放置非常重要。要使其工作,var placesArray:[Place]=[]{didSet{//执行任何需要在此处等待places数组的执行。}}}需要在PFQuery之前执行。