NSURLCache использует кеш для запросов старше max-age

Я пока что бился головой, пытаясь понять, что происходит с NSURLCache.

По сути, сервер, к которому я подключаюсь, не устанавливает заголовки элементов управления кэшем... Так что следуйте различным руководствам и документам Apple (например, https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/URLLoadingSystem/Concepts/CachePolicies.html) Я устанавливаю свои собственные заголовки элементов управления кэшем в делегате willCacheResponse, а затем возвращаю этот измененный ответ в обработчик завершения. Документы Apple и ресурс, который я прочитал, указывают на то, что это должно работать. Но я вижу, что кэшированные данные возвращаются после истечения срока их действия в зависимости от максимального возраста. Кажется, что max-age игнорируется, и NSURLCache использует другую эвристику, чтобы определить, следует ли ему извлекать данные из кэша или нет.

Я установил заголовок управления кэшем max-age=60 и с помощью Чарльза проверил, что данные извлекаются из кеша, и через 60 секунд не выполняются сетевые запросы. В конце концов (кажется недетерминированным) будет сделан новый запрос, который на самом деле отправляется на сервер (обычно через несколько часов, и я пытаюсь повторить запрос).

Вот код, для целей тестирования я просто жестко прописал максимальный возраст до 60 секунд:

func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, willCacheResponse proposedResponse: CachedURLResponse, completionHandler: @escaping (CachedURLResponse?) -> Void) {
    var modifiedReponse: URLResponse? = nil
    if let HTTPResponse = proposedResponse.response as? HTTPURLResponse {

        if var newHeaders = HTTPResponse.allHeaderFields as? [String : String] {

            if newHeaders["Cache-Control"] == nil {
                newHeaders["Cache-Control"] = "max-age=60"
            }

            modifiedReponse = HTTPURLResponse(url: HTTPResponse.url!, statusCode: HTTPResponse.statusCode, httpVersion: "HTTP/1.1", headerFields: newHeaders)
        }
    }
    let response = modifiedReponse ?? proposedResponse.response
    var newCachedResponse: CachedURLResponse? = nil
    newCachedResponse = CachedURLResponse(response: response, data: proposedResponse.data, storagePolicy: proposedResponse.storagePolicy)
}

Там есть несколько необязательных проверок, но я подтвердил, что ответ на newCachedResponse, который я возвращаю, имеет заголовок элемента управления кэшем, установленный в max-age=60. Я делаю что-то явно не так здесь? Или NSURLCache просто F'd?

1 ответ

Я знаю, что это слишком поздно, но я думаю, что вам просто нужно передать этот newCachedResponse обратно в предоставленное вам закрытие обработчика завершения.

Например, последняя строка:

completionHandler(newCachedResponse)
Другие вопросы по тегам