【问题标题】:Array retuning a blank array outside of PFQuery with Parse.使用 Parse 重新调整 PFQuery 之外的空白数组的数组。
【发布时间】:2015-05-29 23:33:26
【问题描述】:

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

【问题讨论】:

    标签: ios arrays swift parse-platform pfquery


    【解决方案1】:

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

    // 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 中执行的属性更新,这是控制流程的好方法。

    【讨论】:

    • 谢谢洛根!摆放位置很重要。为了让它工作, var placesArray: [Place] = [] { didSet { // 执行任何需要在这里等待位置数组的执行。 } } 需要在 PFQuery 之前进行。
    【解决方案2】:

    Logan 的答案是正确的。

    在这个帖子中查看我的答案:Storing values in completionHandlers - Swift

    我详细描述了异步完成处理程序的工作原理,并且在 cmets 中有一个工作示例项目的链接来说明它。

    【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-08-30
      • 2017-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-01
      • 2023-03-30
      • 2014-01-02
      • 2011-03-07
      相关资源
      最近更新 更多