我正在尝试查询我的 _User
类以获得特定的 objectId,并从中下载图像。
如果对照 parse.com 用户表进行检查,则通过 userList
传递的 objectId
是正确的。
返回的数组总是空的
如有任何帮助,我们将不胜感激。
func imageArrayFromUserList(userList: [PFUser]) -> [UIImage] {
var arrayToReturn: [UIImage] = []
for user in userList {
let objectID = user.objectId
let query = PFUser.query()
//let query = PFQuery(className: "_User")
query!.whereKey("objectId", equalTo: objectID!)
//query?.limit = 1
query!.findObjectsInBackgroundWithBlock({ (results: [AnyObject]?, error: NSError?) -> Void in
if error != nil{// This never prints anything to console
println(error)
}
if let results = results as? [PFObject] {
for object in results {
let userPicture = object["image"] as! PFFile
userPicture.getDataInBackgroundWithBlock {
(imageData: NSData?, error: NSError?) -> Void in
if error == nil {
if let imageData = imageData {
let image = UIImage(data:imageData)
arrayToReturn.append(image!)
}
}
}
}
}
})
}
return arrayToReturn
}//end of imageArrayFromUserList method
最佳答案
您还不了解完成处理程序的工作原理。 findObjectsInBackgroundWithBlock
旨在立即返回。它在后台线程上对查找任务进行排队。当任务完成时,可能会在同一个后台线程上调用完成处理程序代码。
因此,您错误地调试了,期望调试器在单步执行创建后台任务的主线程时在完成处理程序中命中断点。它不是那样工作的。
既然你对调试感到困惑,那么在每个阶段都有用的 println()s,例如:
if error != nil{// This never prints anything to console
println(error)
}
else {
println("No error!")
}
if let results = results as? [PFObject] {
println("Got \(results.count\) results!")
for object in results {
println("Got result: \(object)!")
let userPicture = object["image"] as! PFFile
userPicture.getDataInBackgroundWithBlock {
(imageData: NSData?, error: NSError?) -> Void in
if error == nil {
println("Got user picture!")
if let imageData = imageData {
let image = UIImage(data:imageData)
arrayToReturn.append(image!)
}
}
else {
println("could not get user picture!")
}
}
}
}
else {
println("What the hell? Results was not a [PFObject]")
}
现在关于正确设计回调:
您的主函数创建数据请求,然后立即返回。它应该返回 Void,而不是数组。
什么应该反射(reflect)新数据?假设它是一个名为 myTableView 的 UITableView。然后当数组被填充后,将其保存在类的存储属性中,并在对主线程的 dispatch_async
调用中调用 myTableView.reloadData()
。 UITableViewDataSource
函数使用上述存储的数组属性。
我敢肯定这令人困惑。您需要阅读有关集成后台数据的完整教程。
有趣的是,我刚刚为另一个用户做了这件事!
Tutorial in retrieving, mutating and saving array from Parse.com in Swift with UITableView
关于ios - 解析查询,图像数组返回空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31777222/