본문 바로가기
🍎iOS프로그래밍/오늘의 공부

iOS프로그래밍 - 이미지 캐싱(NSCache)

by 둥둥동동# 2022. 7. 23.
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

댓글