Я использую следующий код для проверки поведения в NSURLCache
. Я инициализирую экземпляр API
в AppDelegate
. Я настраиваю менеджер в соответствии с документацией Alamofire, настраиваю общий кеш и назначаю dataTaskWillCacheResponse
, чтобы убедиться, что ответ действительно будет закэширован.
Затем я вызываю makeRequest
, который проверяет, существует ли кешированный ответ (чего не должно быть при первом запуске), а затем я использую свой manager
, чтобы сделать запрос с использованием одного и того же URL-адреса, чтобы запрос был эквивалентен на протяжении всего теста.
Моя точка останова в dataTaskWillCacheResponse
достигнута, я продолжаю, блок responseJSON
выполняется и Success
заполнен, поэтому я performTests
использую запрос.
- Сначала я проверяю, закэширован ли ответ. Хорошо!
- Во-вторых, (и в этом проблема) я удаляю кешированный ответ на этот запрос, а затем проверяю, существует ли он. Так и есть: плохо!
- В-третьих, я проверяю, удалит ли этот ответ удаление всех кэшированных ответов. Так и есть: хорошо! Но странно, что это сработало, а предыдущая попытка просто удалить один ответ не сработала...
Вот код:
import Alamofire
class API: Manager.SessionDelegate {
var manager: Manager!
override init() {
super.init()
manager = Manager(session: urlSession(), delegate: self)
configureCache(memoryCapacityMB: 5, diskCapacityMB: 25)
manager.delegate.dataTaskWillCacheResponse = { urlSession, dataTask, cachedResponse in
// Placing a breakpoint here confirms that the response is going to be cached
return cachedResponse
}
}
private func urlSession() -> NSURLSession {
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
return NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil)
}
private func configureCache(memoryCapacityMB memory: Int, diskCapacityMB disk: Int) {
let memoryCapacity = memory * 1024 * 1024
let diskCapacity = disk * 1024 * 1024
let sharedCache = NSURLCache(memoryCapacity: memoryCapacity, diskCapacity: diskCapacity, diskPath: nil)
NSURLCache.setSharedURLCache(sharedCache)
}
// MARK: Request
func makeRequest() {
// The response should be nil on the first launch since nothing has been cached
let request = NSURLRequest(URL: NSURL(string: "http://jsonplaceholder.typicode.com/posts")!)
let response = NSURLCache.sharedURLCache().cachedResponseForRequest(request)
print(response)
manager.request(.GET, request.URLString).responseJSON { response in
switch response.result {
case .Success:
self.performTests(with: response.request!)
case .Failure:
break
}
}
}
func performTests(with request: NSURLRequest) {
// Should exist
var response = NSURLCache.sharedURLCache().cachedResponseForRequest(request)
print(response)
// And it does: good!
// Remove the cached resopnse and check if it exists
NSURLCache.sharedURLCache().removeCachedResponseForRequest(request)
response = NSURLCache.sharedURLCache().cachedResponseForRequest(request)
print(response)
// And it does: bad!
// Try removing all cached responses and check if it exists
NSURLCache.sharedURLCache().removeAllCachedResponses()
response = NSURLCache.sharedURLCache().cachedResponseForRequest(request)
print(response)
// And it doesn't: good! But odd...
}
}
Как тогда удалить кэшированный ответ на один запрос? И является ли это непреднамеренным поведением? Или NSURLCache
ведет себя правильно, и я просто что-то упускаю? Заранее спасибо за внимание!