以错误的顺序解析到集合视图图像

时间:2015-12-19 02:50:49

标签: swift parse-platform uiimage uicollectionview

我试图从Parse加载图像以在集合视图中显示它们,并且订单有时不会出现。通常情况下,第一张图片会正确显示,但后续图像不会按照至少25%的时间排出。

我已经查找了其他答案,并且我已经尝试过所有类似的事情" orderbyascending","制作字典"但仍然没有运气。

我有Parse类,叫做#34; Fhooder"和"项目"他们是相关的。

if PFUser.currentUser() != nil {
        let user = PFUser.currentUser()!
        let query = PFQuery(className: "Fhooder")
        let id = (user.valueForKey("fhooder")?.objectId)! as String

        query.getObjectInBackgroundWithId(id) { (fhooder: PFObject?, error: NSError?) -> Void in
            if error == nil && fhooder != nil {

                let relation = fhooder!.relationForKey("items")
                let query2 = relation.query()

                query2!.orderByAscending("createdAt")
                query2!.findObjectsInBackgroundWithBlock({ (items: [PFObject]?, error2: NSError?) -> Void in

                    if error2 == nil && items != nil {
                        var index = items!.count
                        for item in items! {
                            let pic = item["photo"] as! PFFile
                            let name = item["itemName"] as! String

                            pic.getDataInBackgroundWithBlock({ (imageData: NSData?, error: NSError?) -> Void in
                                if (error == nil) {
                                    let picture = UIImage(data: imageData!)
                                    self.itemPictures[index] = picture

                                    let counter = self.arrItemNames.count - 1
                                    if index == counter {
                                        self.collectionView.reloadData()
                                    }
                                    index++

                                }
                            })

                            if index != 0 {

                                self.arrItemNames.append(name)

                                index--
                            }
                        }
                    }
                })
            }
            else {

            }
        }
    }
}

这是我的收藏视频

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("collCell2", forIndexPath: indexPath) as! ManageCollectionViewCell

    cell.foodImage.image = self.itemPictures[indexPath.item]

    return cell
}

有人可以帮助我吗?

3 个答案:

答案 0 :(得分:1)

这是我的修订版。为了简单起见,我摆脱了索引,将itemPictures从字典更改为UIImage数组,让Ray的建议每次重新加载,并将所有内容放在getDataInBackgroundWithBlock下以消除任何时间同步错误。但是,图像在创建日期之前仍然没有按顺序排列。真正奇怪的是它以正确的顺序加载的时间是2/3。

var itemPictures : [UIImage] = []
var arrItemNames : [String] = []

if PFUser.currentUser() != nil {
        let user = PFUser.currentUser()!
        let query = PFQuery(className: "Fhooder")
        let id = (user.valueForKey("fhooder")?.objectId)! as String

        query.getObjectInBackgroundWithId(id) { (fhooder: PFObject?, error: NSError?) -> Void in
            if error == nil && fhooder != nil {

                let relation = fhooder!.relationForKey("items")
                let query2 = relation.query()

                query2!.orderByAscending("createdAt")
                query2!.findObjectsInBackgroundWithBlock({ (items: [PFObject]?, error2: NSError?) -> Void in

                    if error2 == nil && items != nil {
                        for item in items! {
                            let pic = item["photo"] as! PFFile

                            pic.getDataInBackgroundWithBlock({ (imageData: NSData?, error: NSError?) -> Void in
                                if (error == nil) {
                                    let name = item["itemName"] as! String
                                    let picture = UIImage(data: imageData!)

                                    self.itemPictures.append(picture)
                                    self.arrItemNames.append(name)

                                    self.collectionView.reloadData()
                                }
                            })
                        }
                    }
                })
            }
            else {

            }
        }
}

答案 1 :(得分:1)

您的代码正在遭受金字塔地狱"嵌套异步调用时会得到。它非常难以遵循流程,并且很难调试。我建议您重新考虑调用的结构,或者使用框架为代码引入类似Promise的结构。由于Parse正在使用Bolts框架,因此您已经安装了此框架。并且它也有相当详细的记录,here

您的代码可能如下所示:

var itemPictures : [UIImage] = []
var arrItemNames : [String] = []

if PFUser.currentUser() != nil {
    let user = PFUser.currentUser()!
    let query = PFQuery(className: "Fhooder")
    let id = (user.valueForKey("fhooder")?.objectId)! as String

    query.getObjectInBackgroundWithId(id).continueWithBlock {
        (task: BFTask!) -> BFTask in
        let fhooder = task.result as! PFObject

        let relation = fhooder.relationForKey("items")
        let query2 = relation.query()
        return query2.findObjectsInBackground()
    }.continueWithBlock {
        (task: BFTask!) -> BFTask in
        let items = task.result as! [PFObject]

        // Do what you need with the objects here...
    }
}

那就是说,您可能不想等到所有图像都被下载,所以我建议每个单元格负责异步下载自己的图片然后代码会在照片完成后更新每个单元格下载。你可以通过谷歌搜索找到这方面的教程。

答案 2 :(得分:0)

在不知道index是什么的情况下,我的猜测是,当你在getDataInBackgroundWithBlock中增加index时就会遇到问题。

它是异步的,因此{{1}}仅在响应到达时递增。