【问题标题】:reloadData after loop parse循环解析后的 reloadData
【发布时间】:2014-09-24 17:43:33
【问题描述】:

我正在尝试在此循环完成时重新加载 tableView,但是每当我尝试将 self.tableView.reloadData() 放在循环之外时,循环返回 0。我想这是因为我得到后台的数据。循环完成后我该怎么做才能重新加载。

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()
                            }







                        }


                    }



                }

            }




        }


    }

}

【问题讨论】:

    标签: ios iphone uitableview swift


    【解决方案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)
            }
    

    【讨论】:

    • 在这一行 dispatch_group_notify 我得到找不到成员 reloadData
    • 编辑您的问题以包含您的新代码。向我们展示整个方法,包括声明。
    【解决方案2】:

    你也可以这样做:

    for (index,obj) in enumerate(imageObj) {
    
        .......
    
        // reload after last loop 
        if(index == imageObj.count) {
            self.tableView?.reloadData()
        }
    
    }
    

    【讨论】:

    • 如果imageObj的最后一个元素不是最后一个完成加载怎么办?
    • 我想你的答案还是更好。如果有人想在最后一个循环之后做某事,这只是一个选项。 (这就是 Thread 发起人所要求的) - 所以如果有人正在寻找类似的东西,也许会有所帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多