解析查询结果不附加到新数组

时间:2015-09-21 13:08:55

标签: ios arrays swift cocoa parse-platform

我正在使用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
    }
}

看起来在查询之前调用外部查询或者其他内容。调试控制台:

enter image description here

1 个答案:

答案 0 :(得分:0)

正如您所说,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)")
            }
        }
    }
}