-
[Swift] NSCache 써보기Swift 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() } }
'Swift' 카테고리의 다른 글
[Swift] NSCountedSet - 리스트에서 중복된 요소의 갯수를 구해보자 (0) 2022.12.31 [Swift] 이중 클로저 (Nested Closure) 안에서 이중으로 [weak self] 해줘야 할까? (0) 2022.12.04 [Swift] GitHub : Rate Limit Exceeded 해결하기 (0) 2022.11.22 [Swift] Enum - Associated Values and Raw Values (0) 2022.11.21 [Swift] removeAll(where:) 써보기 (0) 2022.11.16