首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift的SDWebImage与Nuke

Swift的SDWebImage与Nuke
EN

Stack Overflow用户
提问于 2020-07-15 04:12:34
回答 1查看 841关注 0票数 2

直到上周我一直在使用Nuke,但我转而使用SDWebImage,因为它比Nuke流行几倍,而且看起来更内置。

然而,在切换到SDWebImage之后,我注意到构建时间要长得多。我在这里并不是在征求意见。就有形指标而言,Nuke是不是比SDWebImage更有性能、更轻便?

虽然我对SDWebImage的内部和外部并不了解,但SDWebImage似乎有很多功能,但缺少一个关键的功能:我还没有找到如何在加载镜像时设置网络故障的故障镜像。虽然,这在Nuke中是非常容易做到的。

代码语言:javascript
复制
    let options = ImageLoadingOptions(
        failureImage: #imageLiteral(resourceName: "image-not-found")
    )
    Nuke.loadImage(with: URL(string: products[indexPath.row].imageLink)!, options: options, into: cell.productImage)
EN

回答 1

Stack Overflow用户

发布于 2020-07-15 04:53:40

不需要/推荐使用外部框架,只用于从URL加载图像。

如果你使用一个外部框架,你正在向你的项目添加不必要的代码,因为没有框架只添加一个函数来加载图像,这可能是因为你在该框架中添加了更多不必要的东西。

我建议你自己去实现它!它将比添加一个外部框架更高效、更容易。

这是在没有外部框架的情况下加载图像的代码:

代码语言:javascript
复制
import UIKit

typealias GMImageServiceSuccess = (UIImage) -> Void
typealias GMImageServiceFail = (Error) -> Void

class GMImageService {
    // MARK: - Class vars.
    private static let imageServiceCache = NSCache<NSString, UIImage>()
    
    // MARK: - Vars.
    private var currentDataTask: URLSessionDataTask?
        
    // MARK: - Fetch images functions.
    func gmImageFromURL(_ urlString: String, sucess: GMImageServiceSuccess?, fail: GMImageServiceFail?) {
        if let imageFromCache = GMImageService.imageServiceCache.object(forKey: urlString as NSString) {
            sucess?(imageFromCache)
            return
        }
        
        guard let imageURL = URL(string: urlString) else {
            // ERROR.
            return
        }
        
        URLSession.shared.dataTask(with: imageURL) { data, response, error in
            guard let imageData = data else {
                // ERROR.
                return
            }
            
            if let imageToCache = UIImage(data: imageData) {
                DispatchQueue.main.async {
                    GMImageService.imageServiceCache.setObject(imageToCache, forKey: urlString as NSString)
                    sucess?(imageToCache)
                }
            } else {
                // ERROR.
            }
        }.resume()
    }
    
    // MARK: - Cancel images functions.
    func mpImageCancelCurrent() {
        if let currentTask = self.currentDataTask {
            currentTask.cancel()
        }
    }
}

如果您需要实现图像缓存,请让我知道,这在swift中很容易实现!

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62903295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档