【问题标题】:SDWebImage vs. Nuke for Swift用于 Swift 的 SDWebImage 与 Nuke
【发布时间】:2020-07-14 20:12:34
【问题描述】:

直到上周我一直在使用 Nuke,但我改用了 SDWebImage,因为它比 Nuke 流行几倍,而且看起来更加完善。

但是,在切换到 SDWebImage 后,我注意到构建时间明显延长。我不是在这里征求意见。就具体指标而言,Nuke 是否比 SDWebImage 更高效、更轻量?

虽然我不了解SDWebImage的里里外外,但似乎SDWebImage有很多功能,但缺少一个关键:我还没有找到如何在加载图像时出现网络故障的情况下设置故障图像。虽然,在 Nuke 中非常容易做到。

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

【问题讨论】:

  • 我觉得你也应该检查一下翠鸟
  • @jawadAli Nuke vs SDWebImage 怎么样

标签: ios swift sdwebimage image-caching


【解决方案1】:

没有必要/不建议使用外部框架仅用于从 URL 加载图像。

如果您使用外部框架,您会在项目中添加不必要的代码,因为没有框架可以仅添加功能来加载图像,这可能是您在该框架中添加了更多不必要的东西。

我建议你自己实现它!它将比添加外部框架更高效、更简单。

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

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()
        }
    }
}

如果您需要实现图像缓存,请告诉我,这很容易!

【讨论】:

  • 很抱歉造成误解,但我正在使用 SDWebImage 进行图像缓存。
  • 从 URL 加载图像时实现图像缓存是一个简单的问题,我建议您不要使用这种框架来解决这个问题。我将使用实现的图像缓存来编辑我的评论。
  • 看看我的代码,如果图像不在缓存中,它会从 url 加载图像并将其保存到缓存中。我没有使用 fisheye、SDWebImage 和 Nuke 等不必要的、沉重的和缓慢的框架。
  • 谢谢,我可以用这个。但是,这些框架在模拟器上运行时构建速度很慢,但与手动实现的速度相同。
  • 不要重新发明轮子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多