Swift

[Swift] NSCache 써보기

insub4067 2022. 11. 22. 20:09

많은 프로젝트들이 img 를 url 로 불러온다 

하지만 매번 같은 이미지를 불러오면 얼마나 피곤할까

그래서 캐싱을 한다

 

1st party 로 캐시해보자 

 

class NetworkManager {
    static let shared = NetworkManager()
    private let baseURL = "https://api.github.com/users/"
    let cache = NSCache<NSString, UIImage>() ✅

    private init() {}
}

class ProfileImageView: UIImageView {
    let cache = NetworkManager.shared.cache ✅
    let placeholderImage = UIImage(named: "avatar-placeholder")!

    override init(frame: CGRect) {
        super.init(frame: frame)
        configure()
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    private func configure() {
        layer.cornerRadius = 10
        clipsToBounds = true
        image = placeholderImage
        translatesAutoresizingMaskIntoConstraints = false
    }

    func downloadImage(from urlString: String) {
        let cacheKey = NSString(string: urlString) ✅

        if let image = cache.object(forKey: cacheKey) { ✅
            self.image = image
            return
        }

        guard let url = URL(string: urlString) else { return }
        let task = URLSession.shared.dataTask(with: url) { [weak self] data, response, error in
            guard let self = self else { return }
            if error != nil { return }
            guard let response = response as? HTTPURLResponse, response.statusCode == 200 else { return }
            guard let data = data else { return }
            guard let image = UIImage(data: data) else { return }
            self.cache.setObject(image, forKey: cacheKey) ✅
            DispatchQueue.main.async { self.image = image }
        }
        task.resume()
    }
}