내가 알던 캐쉬.... 메이플 스토리에 옛날에 엄마에게 허락 받고 질렀던 캐쉬가 생각난다.
그 때는 틴캐쉬라고 문방구에서 사서 팔았는데 하하하;;
머쓱해지니 본론으로 넘어가자.
본론
데이터나 값을 미리 복사해 놓는 임시 장소
캐시의 정의이다. 그럼 우리는 왜 임시 보관을 해둬야 할까?
그 답은 빠르기 때문이다.
네트워크 통신은 기기에서 이미지를 불러오는 것보다 훨씬 느리다. 그렇기에 캐쉬를 통해 성능 향상을 기대 할 수 있다.
또한 서버에 매 번 똑같은 요청을 하게된다면 서버는 부담스러울 것이다. 서버입장에서도 캐시된 이미지를 활용하는 것이 좋다.
캐쉬 종류
캐쉬의 종류에는 2가지가 있다.
- Memory Cache
- Disk Cache
Memory Cache는 RAM 상에 데이터를 저장하는 방식이다.
RAM에 저장하는 만큼 앱을 종료하게 된다면 캐시 데이터는 잃게 된다. 하지만 Disk Cache보다 빠르다.
Disk Cache는 말 그대로 디스크에 저장한다. 메모리 캐시보다는 느리지만 앱을 종료하더라도 디스크에 캐시된 데이터가 남아있다는 장점이 있다.
Memory Cache
NSCache는 클래스로 Key-Value 처럼 KeyType-ObjectType 쌍으로 이루고 있다.
자세히보면 KeyType ObjectType 둘다 AnyObject를 상속받고 있다. 즉 Class 형태이여야만 한다.
그렇기에 살짝 추가사항이 요구 된다.
let cacheManager = NSCache<NSString, UIImage>()
let key = NSString("Key")
cacheManager.setObject(UIImage(), forKey: key) // key 값으로 캐시에 데이터 저장
let cachedImage = cacheManager.object(forKey: NSString(key) // key값으로 캐시 데이터 불러오기
위와 같이 사용이 가능하다.
Disk Cache
디스크 캐시는 FileManager를 통해서 관리한다.
데이터 쓰기
// 데이터는 Data 타입을 따르는 변수
guard let data, let cacheURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return }
let filePath = cacheURL.appending(path: String(cacheKey))
try data.write(to: filePath) // 디스크 캐쉬 사용
먼저 FileManager의 urls 라는 함수를 보자.
for 에 들어갈 다양한 변수가 있지만 크게 2가지만 짚고 넘어가면 될듯 하다.
documentDirectory -> 말 그대로 documentDirectory 이며 여기에 저장한 캐시 데이터는 앱 삭제시에 같이 삭제가 된다.
cachesDirectory -> 캐시를 위한 디렉토리인데 OS에 의해서 언제든지 삭제가 될 수 있는 디렉토리이다.
이 변수는 음 공부한 결과는 어디서부터 파일을 찾을 것인지 결정하는 변수인 것 같다. 자세한 설명은 공식문서를....
누군가 잘 알면 알려주세요
데이터 읽기
guard let cacheURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return nil }
let filePath = cacheURL.appending(path: String(cacheKey))
guard let data = FileManager.default.contents(atPath: filePath.path()) else { return nil }
let cachedImage = UIImage(data: data)
데이터를 불러 올 때에는 FileManagerdml contents 함수를 사용해서 값을 불러온다.
데이터 확인
guard let cacheURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return false }
let filePath = cacheURL.appending(path: String(cacheKey))
let isExist = try FileManager.default.fileExists(atPath: String(contentsOf: filePath))
디스크에 캐시된 데이터가 존재하고 있는지 확인 할 때에는 위 처럼 사용한다.
https://developer.apple.com/documentation/foundation/filemanager
https://jasmine-elamblakatt.medium.com/caching-data-with-filemanager-cc3fedf97858
https://pikachu987.tistory.com/33
https://developer.apple.com/documentation/foundation/nscache?changes=_5
------------
https://felix-mr.tistory.com/13
'Swift > Apple Framework' 카테고리의 다른 글
[iOS / Swift] sort() 는 어떤 알고리즘을 쓸까? (0) | 2023.04.22 |
---|---|
[iOS / SwiftUI] Combine - 맛보기 (2) | 2023.04.21 |
[SwiftUI] LazyVGrid / LazyHGrid (0) | 2023.04.18 |
[UIKit / Swift] View LifeCycle (0) | 2023.01.14 |
[SwiftUI] Who is retaining @StateObject and ObservedObject (0) | 2023.01.12 |