繁体   English   中英

循环解析后的reloadData

[英]reloadData after loop parse

我试图在此循环完成时重新加载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()
                            }







                        }


                    }



                }

            }




        }


    }

}

使用调度组。 调度组基本上是一个计数器。 您可以原子地递增和递减它,也可以要求它在为零时得到通知。

每次添加后台任务时,请“输入”该组(这将增加其计数器)。 后台任务完成后,“退出”组(这将减少其计数器)。 当计数器为零(表示所有后台任务已完成)时,请使用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来做到这CGImage

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

您也可以这样做:

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

    .......

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

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM