将图像从 Parse 加载到 UICollectionView 单元格没有延迟

Posted

技术标签:

【中文标题】将图像从 Parse 加载到 UICollectionView 单元格没有延迟【英文标题】:Load image from Parse to UICollectionView cell without lag 【发布时间】:2015-09-26 15:52:24 【问题描述】:

我有一个非常复杂的问题,我认为具有广泛异步知识的人可以帮助我。

我有一个用“图片”对象填充的 collectionView。这些对象是从自定义类创建的,然后再次使用从 Parse(来自 PFObject)获取的数据填充这些对象。

首先,查询解析

func queryParseForPictures() 
    query.findObjectsInBackgroundWithBlock  (objects: [PFObject]?, err: NSError?) -> Void in
        if err == nil 
            print("Success!")
            for object in objects! 
                let picture = Picture(hashtag: "", views: 0, image: UIImage(named: "default")!)
                picture.updatePictureWithParse(object)
                self.pictures.insert(picture, atIndex: 0)
            
            dispatch_async(dispatch_get_main_queue())  [unowned self] in
                self.filtered = self.pictures
                self.sortByViews()
                self.collectionView.reloadData()
            
        
    

现在我还在 PFObject 中获得了一个 PFFile,但是看到将 PFFile 转换为 NSData 也是一个异步调用(同步会阻塞整个事情..),我不知道如何正确加载它。函数“picture.updatePictureWithParse(PFObject)”会更新除 UIImage 之外的所有内容,因为其他值是基本字符串等。如果我还要在此函数中从 PFFile 获取 NSData,则“collectionView.reloadData()”会触发在图片加载之前关闭,我最终会得到一堆没有图片的图片。除非我在之后强制重新加载或其他。因此,我将 PFFile 存储在对象中以供将来在 updatePictureWithParse 中使用。这是 Picture 类内部的超级简单函数:

func updateViewsInParse() 
    let query = PFQuery(className: Constants.ParsePictureClassName)
    query.getObjectInBackgroundWithId(parseObjectID)  (object: PFObject?, err: NSError?) -> Void in
        if err == nil 
            if let object = object as PFObject? 
                object.incrementKey("views")
                object.saveInBackground()
            
         else 
            print(err?.description)
        
    

为了获得半体面的图像,我已经实现了在 cellForItemAtIndexPath 中加载图像,但这太可怕了。前 10 个或其他什么都可以,但是当我向下滚动视图时,它会滞后很多,因为它必须从 Parse 获取下一个单元格。请参阅下面的实现:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(Constants.PictureCellIdentifier, forIndexPath: indexPath) as! PictureCell

    cell.picture = filtered[indexPath.item]

    // see if image already loaded
    if !cell.picture.loaded 
        cell.loadImage()
    
    cell.hashtagLabel.text = "#\(cell.picture.hashtag)"
    cell.viewsLabel.text = "\(cell.picture.views) views"
    cell.image.image = cell.picture.image

    return cell

而实际的获取是在单元格内:

func loadImage() 
    if let imageFile = picture.imageData as PFFile? 
        image.alpha = 0
        imageFile.getDataInBackgroundWithBlock  [unowned self] (imageData: NSData?, err: NSError?) -> Void in
            if err == nil 
                self.picture.loaded = true
                if let imageData = imageData 
                    let image = UIImage(data: imageData)
                    self.picture.image = image
                    dispatch_async(dispatch_get_main_queue()) 
                        UIView.animateWithDuration(0.35) 
                            self.image.image = self.picture.image
                            self.image.alpha = 1
                            self.layoutIfNeeded()
                        
                    
                
            
        
    

我希望你能感觉到我的问题。在单元格出列中获取图像是非常恶心的。此外,如果这几个 sn-ps 没有给出完整的图片,请参阅该项目的 github 链接: https://github.com/tedcurrent/Anonimg

谢谢大家!

/T

【问题讨论】:

【参考方案1】:

可能有点晚了,但是当从 UICollectionView 的数据库中加载 PFImageView 时,我发现这种方法效率更高,尽管我不完全确定原因。我希望它有所帮助。在您的cellForItemAtIndexPath 中使用您的cell.loadImage() 函数。

if let value = filtered[indexPath.row]["imageColumn"] as? PFFile 
    if value.isDataAvailable 
        cell.cellImage.file = value       //assign the file to the imageView file property
        cell.cellImage.loadInBackground() //loads and does the PFFile to PFImageView conversion for you
    

【讨论】:

以上是关于将图像从 Parse 加载到 UICollectionView 单元格没有延迟的主要内容,如果未能解决你的问题,请参考以下文章

无法将图像从 PARSE 加载到 PFTableViewCell 的 imageView 属性中

从 Parse (Swift) 中检索图像到 imageView

使用 Parse 将缩略图图像加载到表格单元格中的问题

尝试从查询中将 Parse PFFiles 加载到 UITableView

iCarousel + Parse:从 PFObject 加载异步图像

如何从 UIImageView 将图像上传到 Parse.com [关闭]