【问题标题】:SDWebImage implementation in parse using Swift使用 Swift 解析的 SDWebImage 实现
【发布时间】:2015-08-08 12:30:56
【问题描述】:

我正在使用解析来检索我的图像和标签并将其显示在集合视图上。问题是集合视图一次加载所有图像和标签,使得加载时间很长并且内存使用率很高。我在想我每次会加载 10 个单元格,但是建议我使用 SDWebImage 来使应用程序更轻。但是我不知道如何使用 swift 解析来实现它。我怀疑我会在下面的这段代码中放一些代码

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("newview", forIndexPath: indexPath) as! NewCollectionViewCell
    let item = self.votes[indexPath.row]


    let gesture = UITapGestureRecognizer(target: self, action: Selector("onDoubleTap:"))
    gesture.numberOfTapsRequired = 2
    cell.addGestureRecognizer(gesture)


    // Display "initial" flag image
    var initialThumbnail = UIImage(named: "question")
    cell.postsImageView.image = initialThumbnail

    // Display the country name
    if let user = item["uploader"] as? PFUser{
        item.fetchIfNeeded()
        cell.userName!.text = user.username


        var profileImgFile = user["profilePicture"] as! PFFile
        cell.profileImageView.file = profileImgFile
        cell.profileImageView.loadInBackground { image, error in
            if error == nil {
                cell.profileImageView.image = image
            }
        }

        var sexInt = user["sex"] as! Int
        var sex: NSString!
        if sexInt == 0 {
            sex = "M"
        }else if sexInt == 1{
            sex = "F"
        }

        var height = user["height"] as! Int
        cell.heightSexLabel.text = "\(sex) \(height)cm"



    }

    if let votesValue = item["votes"] as? Int
    {
        cell.votesLabel?.text = "\(votesValue)"
    }

    // Fetch final flag image - if it exists
    if let value = item["imageFile"] as? PFFile {
        println("Value \(value)") 
        cell.postsImageView.file = value
        cell.postsImageView.loadInBackground({ (image: UIImage?, error: NSError?) -> Void in
            if error != nil {
                cell.postsImageView.image = image
            }
        })
    }

    return cell
}

我已经使用 Pod 实现了 SDWebImage,并通过桥接头导入。有谁知道如何使用 Swift 实现 SDWebImage 解析?

【问题讨论】:

    标签: ios swift parse-platform uicollectionview sdwebimage


    【解决方案1】:

    你应该重新考虑你的方法 -

    我相信你正在使用 collectionViewDelegate 方法 - collectionView(_:cellForItemAtIndexPath:)

    每次集合视图需要处理视图时都会触发。

    在那里您可以访问单元格 imageView 并设置其图像(例如)-

    cell.imageView.sd_setImageWithURL(url, placeholderImage:placeHolderImage, completed: { (image, error, cacheType, url) -> Void in  })
    

    如果你想很好地淡入图像,你可以 -

    cell.imageView.sd_setImageWithURL(url, placeholderImage:placeHolderImage, completed: { (image, error, cacheType, url) -> Void in
                if (cacheType == SDImageCacheType.None && image != nil) {
                    imageView.alpha = 0;
                    UIView.animateWithDuration(0.0, animations: { () -> Void in
                        imageView.alpha = 1
                    })
                } else {
                    imageView.alpha = 1;
                }
            })
    

    编辑

    我看到你使用 Parse,所以你不需要 SDWebImage,你需要使用 Parse - PFImageView,它会在加载时处理你的背景获取图像。您需要保存对 PFObject 的引用,但我相信您已经这样做了。

    例如(在你的 cellForItemAtIndexPath 内)-

    imageView.image = [UIImage imageNamed:@"..."]; // placeholder image
    imageView.file = (PFFile *)someObject[@"picture"]; // remote image
    
    [imageView loadInBackground];
    

    【讨论】:

    • 是的,我正在使用 collectionView(_:cellForItemAtIndexPath:) 并且我知道如何设置图像。我让它完全正常工作,但加载时间太长而且令人沮丧,因为它一次加载所有内容
    • 请解释一下你自己。因为 cellForItemAtIndexPath 应该只为可见的单元格调用。您确定集合视图一次加载所有单元格吗?
    • 是的.. 但我不需要花哨的动画,请重新阅读我的问题。如果被问到,我可以显示我的 cellForItemAtIndexPath
    • 在我的回答中添加了编辑
    • 谢谢,我已经更新了我的问题并添加了更多代码,可以吗?
    【解决方案2】:

    集合视图中显示了多少对象? 既然你提到了SDWebImage,你是不是也在后台下载图片?

    如果您想在用户滚动时加载图像,请查看SDWebImage 的文档。 first use case 描述了如何在不阻塞主线程的情况下在表格视图单元格中显示图像。集合视图单元的实现应该类似。

    【讨论】:

    • 是的,谢谢你,我已经读过了,但我不知道用什么替换 sd_setImageWithURL:placeholderImage: 方法,因为 Parse 没有 URL
    • 那么如何从 Parse 中获取图像?
    • cell.postsImageView.loadInBackground({ (image: UIImage?, error: NSError?) -> 我在后台加载时无效
    • 似乎不需要SDWebImage 那么,Parse 正在做类似的事情。使用 Time Profile 在仪器中运行您的应用,并检查是什么降低了集合视图的速度。
    • 真的!!但是为什么它加载缓慢,无论如何我可以让它不会一次加载并且一次加载 10 个左右
    猜你喜欢
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多