NSURLCache Alamofire удаляет кешированные ответы

Я использую следующий код для проверки поведения в NSURLCache. Я инициализирую экземпляр API в AppDelegate. Я настраиваю менеджер в соответствии с документацией Alamofire, настраиваю общий кеш и назначаю dataTaskWillCacheResponse, чтобы убедиться, что ответ действительно будет закэширован.

Затем я вызываю makeRequest, который проверяет, существует ли кешированный ответ (чего не должно быть при первом запуске), а затем я использую свой manager, чтобы сделать запрос с использованием одного и того же URL-адреса, чтобы запрос был эквивалентен на протяжении всего теста.

Моя точка останова в dataTaskWillCacheResponse достигнута, я продолжаю, блок responseJSON выполняется и Success заполнен, поэтому я performTests использую запрос.

  1. Сначала я проверяю, закэширован ли ответ. Хорошо!
  2. Во-вторых, (и в этом проблема) я удаляю кешированный ответ на этот запрос, а затем проверяю, существует ли он. Так и есть: плохо!
  3. В-третьих, я проверяю, удалит ли этот ответ удаление всех кэшированных ответов. Так и есть: хорошо! Но странно, что это сработало, а предыдущая попытка просто удалить один ответ не сработала...

Вот код:

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 ведет себя правильно, и я просто что-то упускаю? Заранее спасибо за внимание!


person Clay Ellis    schedule 02.08.2016    source источник
comment
У меня точно такая же проблема, вы нашли решение?   -  person Louis    schedule 22.09.2017
comment
@Louis, я не тестировал iOS 11 или Swift 4, но, насколько я помню, поведение по умолчанию в iOS 10 действительно было неправильным, поэтому мне пришлось написать собственный кеш. У меня больше нет кода для этого кеша, как для корпоративного приложения.   -  person Clay Ellis    schedule 25.09.2017


Ответы (1)


Насколько я помню, большинство изменений кэша URL-адресов не синхронны. На самом деле они происходят только после того, как вы вернетесь в цикл выполнения и разрешите выполнение различных асинхронных обратных вызовов.

Попробуйте выполнить остальную часть кода асинхронно после задержки в 3-5 секунд и посмотрите, был ли удален запрос.

Если это не решит проблему, сообщите об ошибке.

person dgatwood    schedule 24.09.2016