2014-09-24 46 views
0

我想重新加載tableView當這個循環完成,但每當我嘗試把self.tableView.reloadData()在循環之外,循環返回0.我想這是由於我在後臺獲取數據。我可以做什麼,以便在循環完成後重新加載。reloadData循環解析後

func loadData() { 
    var query = PFQuery(className: "Items") 
    query.includeKey("user") 
    query.getObjectInBackgroundWithId(itemId) { 
     (itemObject: PFObject!, error: NSError!) -> Void in 
     if (error == nil) { 


      var userObject = itemObject.objectForKey("user") as PFObject 


      let userImageFile = userObject.objectForKey("file") as PFFile 
      userImageFile.getDataInBackgroundWithBlock { 
       (imageData: NSData!, error: NSError!) -> Void in 
       if error == nil { 
        let image = UIImage(data:imageData) 






        self.detailDic?.setObject(itemObject.objectForKey("title"), forKey: "title") 
        self.detailDic?.setObject(itemObject.objectForKey("description"), forKey: "desc") 
        self.detailDic?.setObject(itemObject.objectForKey("location"), forKey: "point") 
        self.detailDic?.setObject(userObject.objectForKey("name"), forKey: "name") 
        self.detailDic?.setObject(userObject.objectForKey("gender"), forKey: "gender") 
        self.detailDic?.setObject(image, forKey: "image") 

        var relation = itemObject.relationForKey("file") as PFRelation 
        var imageQuery = relation.query() as PFQuery 
        imageQuery.findObjectsInBackgroundWithBlock { (imageObj: [AnyObject]!, error1: NSError!) -> Void in 
         if error1 == nil { 

          var imageDic:NSMutableArray = NSMutableArray() 

          let group = dispatch_group_create() 

          for obj in imageObj { 
           var imageObject = obj as PFObject 
           var thumbnail = imageObject.objectForKey("file") as PFFile 
           // Important: enter the group *before* starting the background task. 
           dispatch_group_enter(group) 
           thumbnail.getDataInBackgroundWithBlock { 
            (imageData: NSData!, error: NSError!) -> Void in 
            if error == nil { 
             let theImage = UIImage(data:imageData) 
             theImage.CGImage 
             self.imageArray!.addObject(theImage) 
             dispatch_group_leave(group) 
            } 
           } 
          } 

          dispatch_group_notify(group, dispatch_get_main_queue()) { 
           self.tableView?.reloadData() 
          } 







         } 


        } 



       } 

      } 




     } 


    } 

} 

回答

0

你也可以這樣做:

for (index,obj) in enumerate(imageObj) { 

    ....... 

    // reload after last loop 
    if(index == imageObj.count) { 
     self.tableView?.reloadData() 
    } 

} 
+0

如果'imageObj'的最後一個元素是不是最後完成加載什麼? – 2014-09-24 18:11:31

+0

我想你的答案還是比較好的。如果有人想在最後一個循環後執行某些操作,這只是一個選項。 (這是線程初學者所要求的) - 如果有人正在尋找類似這樣的東西 – derdida 2014-09-24 18:14:22

1

使用調度組。派遣組基本上是一個計數器。您可以以原子方式遞增和遞減,並且可以要求在零時通知它。

每次添加後臺任務時,都會輸入組(增加其計數器)。當一個後臺任務完成時,「退出」該組(遞減其計數器)。當計數器爲零時,使用dispatch_group_notify來運行塊(表示所有後臺任務已完成)。

let group = dispatch_group_create() 

for obj in imageObj { 
    var imageObject = obj as PFObject 
    var thumbnail = imageObject.objectForKey("file") as PFFile 
    // Important: enter the group *before* starting the background task. 
    dispatch_group_enter(group) 
    thumbnail.getDataInBackgroundWithBlock { 
     (imageData: NSData!, error: NSError!) -> Void in 
     if error == nil { 
      let theImage = UIImage(data:imageData) 
      self.imageArray!.addObject(theImage) 
      dispatch_group_leave(group) 
     } 
    } 
} 

dispatch_group_notify(group, dispatch_get_main_queue()) { 
    self.tableView?.reloadData() 
} 

注意,如果沒有元素imageObj,或者如果所有的後臺任務之前dispatch_group_notify運行完成,dispatch_group_notify立即運行塊(這是你想要的)。

此外,UIImage不一定在您創建圖像數據時對其進行解碼。它可以這樣懶惰地做。您可能需要強制它在後臺線程上解碼圖像數據。你可以做到這一點,要求其CGImage

 if error == nil { 
      let theImage = UIImage(data:imageData) 
      theImage.CGImage // force decoding immediately 
      self.imageArray!.addObject(theImage) 
      dispatch_group_leave(group) 
     } 
+0

dispatch_group_notify我可能找不到成員reloadData – gamerChristian 2014-09-24 18:21:20

+0

編輯您的問題以包含您的新代碼。向我們展示整個方法,包括聲明。 – 2014-09-24 18:24:45

+0

我已經做到了。 – gamerChristian 2014-09-24 18:27:13