SDWebImage против Nuke для Swift - PullRequest
       144

SDWebImage против Nuke для Swift

1 голос
/ 14 июля 2020

Я использовал Nuke до прошлой недели, но я переключился на SDWebImage, потому что он в несколько раз популярнее Nuke и кажется более продуманным.

Однако после перехода на SDWebImage я заметил значительно дольше время сборки. Я не прошу здесь мнения. Что касается ощутимых показателей, является ли Nuke более производительным и легким, чем 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)

1 Ответ

0 голосов
/ 14 июля 2020

Не обязательно / не рекомендуется использовать внешние фреймворки только для загрузки изображения с 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()
        }
    }
}

Сообщите мне, если вам нужно реализовать кеш изображений, быстро!

...