【问题标题】:Parse Query Results Not Appending to New Array解析未附加到新数组的查询结果
【发布时间】:2015-09-21 13:08:55
【问题描述】:

我正在使用 Swift,我正在尝试将 Parse Query 的结果附加到数组中,但是,该数组仅在查询的 for 循环中打印时才显示附加值。当我在方法返回之前尝试在循环之外打印数组时,我得到一个空数组。如何获取带有附加值的数组以显示在 for 循环之外?

class Task {   

    func all() -> Array<String> {
        var taskArray = Array<String>()
        var query = PFQuery(className:"Task")
        var currentUser = PFUser.currentUser() // this will now be nil
        let userId = currentUser?.objectId
        query.whereKey("userId", equalTo: currentUser!)
        query.findObjectsInBackgroundWithBlock {
            (objects: [AnyObject]?, error: NSError?) -> Void in

            if error == nil {
                // The find succeeded.
                println("Successfully retrieved \(objects!.count) tasks.")

                // Do something with the found objects
                if let objects = objects as? [PFObject] {
                    for object in objects {
//                        println(object.objectId)
                        let title = object["title"]! as! String
                        taskArray.append(title)
                        println("Array: \(taskArray)")
                    }
                }
            } else {
                // Log details of the failure
                println("Error: \(error!) \(error!.userInfo!)")
            }
        }
        println("Outside query array: \(taskArray)")


        return taskArray
    }
}

看起来外部查询在查询之前被调用或类似的东西。调试控制台:

【问题讨论】:

    标签: ios arrays swift cocoa parse-platform


    【解决方案1】:

    正如你所说,println("Outside query array: \(taskArray)") 在println("Array: \(taskArray)") 之前被调用,对此有一个简单的解释。

    findObjectsInBackgroundWithBlock 是一种异步方法,这意味着它会启动另一个线程并在这个线程上工作。这意味着你调用findObjectsInBackgroundWithBlock的那一刻,然后它直接继续到println("Outside query array: \(taskArray)")。


    现在,可以从 Parse 同步下载东西(所以它不会直接跳到println("Outside query array: \(taskArray)")),但我不建议你这样做。

    相反,我建议您实现一个在下载完成时调用的闭包。类似于以下内容(PS,它是用 Swift 2 编写的):

    //
    //  ViewController.swift
    //  ParseFun
    //
    //  Created by Stefan Veis Pennerup on 21/09/15.
    //  Copyright (c) 2015 Kumuluzz. All rights reserved.
    //
    
    import UIKit
    
    class ViewController: UIViewController {
    
        // MARK: - Lifecycle methods
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            all { (tasks) -> Void in
                print("The downloaded tasks are: \(tasks)")
            }
        }
    
        // MARK: - Download methods
    
        func all(completionHandler: ([String])->Void) {
            // Creates the query
            var taskArray = Array<String>()
            let query = PFQuery(className:"Task")
            let currentUser = PFUser.currentUser() // this will now be nil
            query.whereKey("userId", equalTo: currentUser!)
    
            // Starts the download
            query.findObjectsInBackgroundWithBlock {
                (objects: [AnyObject]?, error: NSError?) -> Void in
    
                if error == nil {
                    // The find succeeded.
                    print("Successfully retrieved \(objects!.count) tasks.")
    
                    // Do something with the found objects
                    if let objects = objects as? [PFObject] {
                        for object in objects {
                            let title = object["title"]! as! String
                            taskArray.append(title)
                            print("Array: \(taskArray)")
                        }
                    }
    
                    completionHandler(taskArray)
    
                } else {
                    // Log details of the failure
                    print("Error: \(error!) \(error!.userInfo)")
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-04
      • 2015-12-18
      • 1970-01-01
      • 2021-08-01
      相关资源
      最近更新 更多