Предотвращение ответов 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. Это ваши просьбы никогда не будут чечены