【发布时间】:2014-11-15 14:53:37
【问题描述】:
我有一个 loadItem 函数,假设从解析服务器加载项目。这包括一个循环,最后我将数据保存到数组中:
itemArray?.addObject(arrayDic)
保存后,我想重新加载 collectionView 的数据。因此我已将它插入到 dispatch_async 块中,但它似乎仍然在将数据保存到 itemArray 数组之前运行,因为 itemArray.count 为 0,并且我已经在循环内检查了数据是否保存到数组。我究竟做错了什么?
func loadItems() {
var query = PFQuery(className:"Items")
query.orderByAscending("createdAt")
query.findObjectsInBackgroundWithBlock {
(objects: [AnyObject]!, error: NSError!) -> Void in
if error == nil {
for object in objects {
var imageRelation: PFRelation = object.relationForKey("pictures")
var query = imageRelation.query()
query.orderByDescending("createdAt")
query.findObjectsInBackgroundWithBlock {
(imageObjects: [AnyObject]!, error: NSError!) -> Void in
if error == nil {
var theArray = imageObjects as NSArray
var arrayDic = NSMutableDictionary()
let imageFile = theArray.objectAtIndex(0).objectForKey("image") as PFFile
imageFile.getDataInBackgroundWithBlock {
(imageData: NSData!, error: NSError!) -> Void in
if !(error != nil) {
let image = UIImage(data:imageData)
arrayDic.setValue(object.objectForKey("price"), forKey: "price")
arrayDic.setValue(image, forKey: "image")
itemArray?.addObject(arrayDic)
}
}
}
}
}
dispatch_async(dispatch_get_main_queue()) {
println(itemArray?.count)
self.collectionView.reloadData()
}
} else {
// Log details of the failure
NSLog("Error: %@ %@", error, error.userInfo!)
}
}
}
【问题讨论】:
-
看起来您正在对“
query.findObjectsInBackgroundWithBlock”进行两次嵌套调用,而您的reloadData调用发生在外部findObjectsInBackgroundWithBlock。如果将reloadData放入内部块会发生什么? -
那么它会循环几次?
-
既然外部
findObjectsInBackgroundWithBlock已经在后台运行,为什么不通过findObjects重构内部块以同步运行(或作为外部循环的一部分)?然后,找到所有内容后,您可以在外部(也是唯一)块的末尾调用reloadData。 -
你能举个例子吗,不确定我是否完全理解
标签: ios arrays swift parse-platform