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

时间:2015-05-29 23:33:27

标签: ios arrays swift parse-platform pfquery

Array在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****

3 个答案:

答案 0 :(得分:4)

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

// 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中正在执行的属性更新的执行行为是一种控制流的好方法。

答案 1 :(得分:2)

洛根的回答是正确的。

请参阅此主题中的答案:{{3}}

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

答案 2 :(得分:1)

/test/type1/1/_update?version=5是一个在后台执行的块操作 - 它是异步的。

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