Предотвращение ответов NSURLSession на кеширование

Почему он кэширует ответы. Он возвращает ранее полученные ответы. Он работает даже при отключении сетевого соединения. Сброс симулятора iOS тоже не работал. Выполнение запроса, а затем с помощью интернет-оффлайн работает (кэшируется).

public let urlSession: NSURLSession

public init()
{
    // ...

    var configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
    configuration.requestCachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData
    urlSession = NSURLSession(configuration: configuration)
}

func makeRequest(path: String, httpMethod:String, body:String?, baseUrl: String?, headers:[String:String]=[:], callback: JsonRequestCallback)
{
    let urlString = (baseUrl ?? customOAuth2Manager.API_URL) + path
    let url = NSURL(string: urlString)
    let request = oauthInstance.request(forURL: url!)

    request.HTTPMethod = httpMethod
    self.customOAuth2Manager.setupRequest(request)

    for (key, value) in headers {
        request.setValue(value, forHTTPHeaderField:key)
    }

    if let body = body where body != "" {
        let postData = (body as NSString).dataUsingEncoding(NSUTF8StringEncoding)
        request.HTTPBody = postData
    }

    let task = urlSession.dataTaskWithRequest(request) { data, response, error in
        self.parseData(data, response:response, error:error, body:body, callback: callback)
    }
    task.resume()
}

Обновление

Мне удалось решить это, вызвав этот код из didFinishLaunching в AppDelegate:

func removeUrlCache()
{
    NSURLCache.setSharedURLCache(NSURLCache(memoryCapacity: 0, diskCapacity: 0, diskPath: nil))
}

Однако мне все еще интересно, почему мой исходный код не работает. Также кажется немного уродливым, чтобы отключить кеш для всего приложения, чтобы решить мою проблему.

Ответ 1

Спасибо за вопрос. Это поставило меня на правильный путь.

NSURLCache.sharedURLCache() предоставляет больше возможностей, и для этого вам не нужно менять емкость памяти и дисков.

Вы можете удалить все кэшированные ответы. Работает для меня.

URLCache.shared.removeAllCachedResponses()

Или вы можете удалить кеш для одного ответа. Не работает для меня iOS 9.

let request = URLRequest(url: URL(string: url)!, cachePolicy: .reloadIgnoringLocalCacheData, timeoutInterval: 10)
    URLCache.shared.removeCachedResponse(for: request)

//Do your request here

Я надеюсь, что это поможет кому-то!

Изменить: NSURLCache.sharedURLCache().removeCachedResponseForRequest(request), к сожалению, не работает для меня

Моя альтернатива была: я использую это для обновления, и я отслеживаю дату последнего обновления. Поэтому я использовал следующий код:

 URLCache.shared.removeCachedResponses(since: lateUpdate)

Но по какой-то причине это не работает эфир.

Начиная с iOS 8, методы удаления одного кэша, похоже, не работают: fooobar.com/questions/202483/...

2019-05-24, обновление до Swift 5.

Ответ 2

Не уверен, что это фактически предотвращает перехват или просто заставляет новую перезагрузку каждый раз, но это то, что сработало для меня:

request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData

Вот скриншот, показывающий другие варианты в случае, если кто-то может понадобиться им:

введите описание изображения здесь

Ответ 3

Я бы реализовал URLSessionDelegate и вызвал завершение Block с nil в реализации делегата willCache. Это ваши просьбы никогда не будут чечены