TIL
🌱 난 오늘 무엇을 공부했을까?
📌 URLCache - 공식문서
URL 요청
을 캐시된 응답 개체에 매핑하는 개체.
📍 Declaration
class URLCache : NSObject
📍 Overview
- URLCache 클래스는 NSURLRequest 개체를 CachedURLResponse 개체에 매핑하여 URL 로드 요청에 대한 응답 캐싱을 구현합니다.
- 메모리 및 디스크 상의 복합 캐시를 제공하며 메모리 및 디스크 부분의 크기를 모두 조작할 수 있습니다.
- 캐시 데이터가 영구적으로 저장되는 경로를 제어할 수도 있습니다.
iOS에서 온디스크 캐시는 시스템의 디스크 공간이 부족할 때 제거될 수 있지만 앱이 실행되고 있지 않을 때만 가능합니다.
📍 Thread Safety
- iOS 8 이상 및 macOS 10.10 이상에서 URLCache는 스레드로부터 안전합니다.
- URLCache 인스턴스 메서드는 동시에 여러 실행 컨텍스트에서 안전하게 호출할 수 있지만,
cachedResponse(for:) 및 storeCachedResponse(_:for:)와 같은 메소드에는 동일한 요청에 대한 응답을 읽거나 쓰려고 할 때 피할 수 없는 Race Condition이 있습니다.
- URLCache의 하위 클래스는 이러한 스레드로부터 안전한 방식으로 재정의된 메서드를 구현해야 합니다.
📍 Subclassing Notes
- URLCache 클래스는 있는 그대로 사용하기 위한 것이지만 특정 요구 사항이 있을 때 하위 클래스로 지정할 수 있습니다.
- 예를 들어, 캐시된 응답을 선별하거나 보안 또는 기타 이유로 스토리지 메커니즘을 다시 구현하려고 할 수 있습니다.
- 이 클래스의 메서드를 재정의할 때 작업 매개 변수를 사용하는 메서드가 그렇지 않은 메서드보다 시스템에서 선호된다는 점에 유의하십시오. 따라서 다음과 같이 서브클래싱할 때 작업 기반 메서드를 재정의해야 합니다.
- 캐시에 응답 저장 — Override the task-based
storeCachedResponse(_:for:)
, instead of or in addition to the request-based storeCachedResponse(_:for:)
.
- 캐시에서 응답 받기 Override
getCachedResponse(for:completionHandler:)
, instead of or in addition to cachedResponse(for:)
.
- 캐시된 응답 제거 — Override the task-based
removeCachedResponse(for:)
, instead of or in addition to the request-based removeCachedResponse(for:)
.
📍 Topics
🔗 Getting and Setting Shared Cache
class var shared: URLCache
🔗 Creating a New Cache Object
init(memoryCapacity: Int, diskCapacity: Int, directory: URL?)
- 지정된 디렉토리에 지정된 메모리 및 디스크 용량으로 URL 캐시 개체를 만듭니다.
🔗 Getting and Storing Cached Objects
func cachedResponse(for: URLRequest) -> CachedURLResponse?
- 지정된 URL 요청에 대한 캐시의 캐시된 URL 응답을 반환합니다.
func storeCachedResponse(CachedURLResponse, for: URLRequest)
- 지정된 요청에 대해 캐시된 URL 응답을 저장합니다.
func getCachedResponse(for: URLSessionDataTask, completionHandler: (CachedURLResponse?) -> Void)
- 데이터 작업에 대해 캐시된 URL 응답을 가져와 제공된 완료 처리기에 전달합니다.
func storeCachedResponse(CachedURLResponse, for: URLSessionDataTask)
- 지정된 데이터 작업에 대해 캐시된 URL 응답을 저장합니다.
🔗 Removing Cached Objects
func removeCachedResponse(for: URLRequest)
- 지정된 URL 요청에 대해 캐시된 URL 응답을 제거합니다.
func removeCachedResponse(for: URLSessionDataTask)
- 지정된 데이터 작업에 대해 캐시된 URL 응답을 제거합니다.
func removeCachedResponses(since: Date)
- 제공된 날짜 이후 캐시된 응답의 지정된 캐시를 지웁니다.
func removeAllCachedResponses()
- 수신자의 캐시를 지우고 저장된 모든 캐시된 URL 응답을 제거합니다.
🔗 Getting and Setting On-disk Cache Properties
var currentDiskUsage: Int
var diskCapacity: Int
🧏♂️ Getting and Setting In-memory Cache Properties
var currentMemoryUsage: Int
var memoryCapacity: Int
🔗 Cache Storage Policies
enum URLCache.StoragePolicy
- CachedURLResponse 개체에서 사용하는 캐싱 전략을 지정합니다.
case allowed <- (default)
- URLCache의 저장은 제한 없이 허용됩니다.
case allowedInMemoryOnly
- URLCache의 저장이 허용됩니다. 그러나 스토리지는 메모리로만 제한되어야 합니다.
case notAllowed
- URLCache의 저장은 메모리나 디스크에 어떤 방식으로든 허용되지 않습니다.
URLCache - 공식문서
핵심은 Request에 대한 URL 응답 자체를 캐싱하는 것.