我正在使用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
}
}
看起来在查询之前调用外部查询或者其他内容。调试控制台:
答案 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)")
}
}
}
}