直到上周我一直在使用 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)
你可以使用
placeholderImage
吗?
avaImage.sd_setImage(with: imageUrl,
placeholderImage: #imageLiteral(resourceName: "placeholder"),
options: SDWebImageOptions(rawValue: 0),
completed: { (image, error, cacheType, imageUrl) in
completionHandler(true)
})
没有必要/建议仅使用外部框架来从 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()
}
}
}
如果您需要实现图像缓存,请告诉我,这很简单!