SDWebImage 与 Nuke for Swift

问题描述 投票:0回答:2

直到上周我一直在使用 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)
ios swift sdwebimage image-caching
2个回答
0
投票

你可以使用

placeholderImage
吗?

avaImage.sd_setImage(with: imageUrl,
                     placeholderImage: #imageLiteral(resourceName: "placeholder"),
                     options: SDWebImageOptions(rawValue: 0), 
                     completed: { (image, error, cacheType, imageUrl) in
                        completionHandler(true)
})

-5
投票

没有必要/建议仅使用外部框架来从 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()
        }
    }
}

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

© www.soinside.com 2019 - 2024. All rights reserved.