728x90
이미지 캐싱
이미지를 캐시에 저장하는 방법
이미지를 캐시에 저장하기
반복적으로 사용되어야 한는 자료들은 메모리에 저장해두고 필요할 때마다 꺼내쓰는 방식으로 리소스를 아낄 수 있습니다
애플에서 기본으로 제공해주는 NSCache 클래스를 사용하면 메모리에 데이터를 저장해 둘 수 있습니다
@IBAction func download(_ sender: UIButton) {
var url = URL(string:self.stringURL1)
let task1 = URLSession.shared.dataTask(with: url!) { data, response, error in
guard let data = data else {return}
let img = UIImage(data: data)
DispatchQueue.main.async{
self.img1.image = img
}
}
task1.resume()
url = URL(string:self.stringURL2)
let task2 = URLSession.shared.dataTask(with: url!) { data, response, error in
guard let data = data else {return}
let img = UIImage(data: data)
DispatchQueue.main.async{
self.img2.image = img
print("a")
}
}
task2.resume()
}
|
cs |
이 소스는 매번 다운로드를 누를 때 마다 이미지를 다운로드 하게 됩니다
NSCacha()를 사용하면 다음과 같습니다
@IBAction func download(_ sender: UIButton) {
let NsUrl1 = NSString(string: stringURL1)
let NsUrl2 = NSString(string: stringURL2)
if let CachedImage1 = ImageCacheManager.shared.object(forKey: NsUrl1){
self.img1.image = CachedImage1
}else{
let url = URL(string:self.stringURL1)
let task = URLSession.shared.dataTask(with: url!) { data, response, error in
guard let data = data else {return}
let img = UIImage(data: data)
DispatchQueue.main.async{
self.img1.image = img
ImageCacheManager.shared.setObject(img!, forKey: NsUrl1)
}
}
task.resume()
}
if let CachedImage2 = ImageCacheManager.shared.object(forKey: NsUrl2){
self.img2.image = CachedImage2
}else{
let url = URL(string:self.stringURL2)
let task = URLSession.shared.dataTask(with: url!) { data, response, error in
guard let data = data else {return}
let img = UIImage(data: data)
DispatchQueue.main.async{
self.img2.image = img
ImageCacheManager.shared.setObject(img!, forKey: NsUrl2)
}
}
task.resume()
}
}
class ImageCacheManager {
static let shared = NSCache<NSString, UIImage>()
private init() {}
}
|
cs |
NSCache의 Key와 Value는 Class인 NSString형과 이미지 저장을 위해 UIImage 타입으로 선언했습니다
먼저 NSCahche.object(forKey:)메서드로 해당 객체에 접근을 시도합니다 만약 해당 캐시값이 존재한다면 이미지를 반환할 것이고 캐시값이 없다면 nil을 반환할 것입니다
nil이라면 (처음으로 다운로드 시도한다면) 이미지 다운로드 task를 실행하며 불러온 이미지는 setObject(_:forKey:) 메서드로 캐시에 저장합니다. 이 때 이미지의 키 값은 이미지의 url로 정합니다
다운로드가 다시 눌리면 해당 키 값이 존재하기 때문에 캐시에 저장된 값으로 이미지를 출력합니다
728x90
'🍎iOS프로그래밍 > 오늘의 공부' 카테고리의 다른 글
iOS - DispatchQueue_2 (0) | 2022.07.27 |
---|---|
iOS프로그래밍 - URL Scheme 외부 앱 호출하기 (0) | 2022.07.25 |
Mac - Source Tree 소스트리 강제종료 현상 (0) | 2022.07.16 |
iOS - 디스패치큐 알아보기 - main, global(), private (0) | 2022.07.15 |
iOS - DispatchQueue 알아보기 (0) | 2022.07.14 |
댓글