我有一個loadItem函數,它是假設從一個分析服務器加載項目。這包括一個循環,我在結束時將數據保存到一個數組:reloadData當循環完成
itemArray?.addObject(arrayDic)
當這個被保存我想給的CollectionView的reloadData。因此我已經將它插入到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'。 –