2014-09-24 67 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