세상을 더 편리하게
article thumbnail
Published 2023. 4. 19. 01:10
[iOS / Swift] Cache Swift/Apple Framework
728x90

내가 알던 캐쉬.... 메이플 스토리에 옛날에 엄마에게 허락 받고 질렀던 캐쉬가 생각난다.

그 때는 틴캐쉬라고 문방구에서 사서 팔았는데 하하하;;

머쓱해지니 본론으로 넘어가자.

본론

데이터나 값을 미리 복사해 놓는 임시 장소

캐시의 정의이다. 그럼 우리는 왜 임시 보관을 해둬야 할까?

그 답은 빠르기 때문이다.

네트워크 통신은 기기에서 이미지를 불러오는 것보다 훨씬 느리다. 그렇기에 캐쉬를 통해 성능 향상을 기대 할 수 있다.

또한 서버에 매 번 똑같은 요청을 하게된다면 서버는 부담스러울 것이다. 서버입장에서도 캐시된 이미지를 활용하는 것이 좋다.

캐쉬 종류

캐쉬의 종류에는 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))

디스크에 캐시된 데이터가 존재하고 있는지 확인 할 때에는 위 처럼 사용한다.

 

728x90
profile

세상을 더 편리하게

@쵱니

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!