使用 Parse 在 PFQuery 之外重新调整空白数组的数组。
Array retuning a blank array outside of PFQuery with Parse.
数组在 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****
query.findObjectsInBackgroundWithBlock
是在后台执行的块操作 - 它是异步的。
行 println(placesArr)
实际上在该块完成之前执行 - 这就是为什么您在那里看到 nil
。
这是一个与线程有关的非常普遍的误解,问题是事件的顺序 运行:
// 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
中执行的 属性 更新的执行行为是控制流程的好方法。
Logan 的回答是正确的。
查看我在这个帖子中的回答:
我写了一篇关于异步完成处理程序如何工作的详细描述,在评论中有一个 link 对一个工作示例项目进行了说明。
数组在 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****
query.findObjectsInBackgroundWithBlock
是在后台执行的块操作 - 它是异步的。
行 println(placesArr)
实际上在该块完成之前执行 - 这就是为什么您在那里看到 nil
。
这是一个与线程有关的非常普遍的误解,问题是事件的顺序 运行:
// 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
中执行的 属性 更新的执行行为是控制流程的好方法。
Logan 的回答是正确的。
查看我在这个帖子中的回答:
我写了一篇关于异步完成处理程序如何工作的详细描述,在评论中有一个 link 对一个工作示例项目进行了说明。