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