Как отключить кэширование из NSURLSessionTask
в моем приложении iOS я использую NSURLSessionTask
для загрузки данных json в мое приложение. Я обнаружил, что при вызове url-адреса непосредственно из браузера я получаю обновленный json, а когда он вызывается из приложения, я получаю более старую версию json.
это связано с кэшированием? Как я могу сказать!--1--> Не использовать кэширование.
это вызов, который я использую:
NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
спасибо!
6 ответов
Если Вы читаете ссылки из @runmad, вы можете увидеть на блок-схеме, что если голова файла не изменилась, она все равно будет использовать кэшированную версию при установке cachePolicy.
в Swift3 я должен был сделать это, чтобы заставить его работать:
let config = URLSessionConfiguration.default
config.requestCachePolicy = .reloadIgnoringLocalCacheData
config.urlCache = nil
let session = URLSession.init(configuration: config)
это получило действительно не кэшированную версию файла, которая мне нужна для расчетов оценки пропускной способности.
вместо sharedSession
, вы также можете создать свой собственный NSURLSession
С помощью NSURLSessionConfiguration
это указывает политику кэша по умолчанию. Итак, определите свойство для вашего сеанса:
@property (nonatomic, strong) NSURLSession *session;
и затем:
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
configuration.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
self.session = [NSURLSession sessionWithConfiguration:configuration];
тогда запросы, использующие этот сеанс, будут использовать это requestCachePolicy
.
Swift 3, Xcode 8
extension UIImageView {
func donloadImage(fromUrl url: URL) {
let request = URLRequest(url: url, cachePolicy: URLRequest.CachePolicy.reloadIgnoringLocalCacheData, timeoutInterval: 60.0)
URLSession.shared.dataTask(with: request) { (data, response, error) in
guard
let httpURLResponse = response as? HTTPURLResponse, httpURLResponse.statusCode == 200,
let mimeType = response?.mimeType, mimeType.hasPrefix("image"),
let data = data, error == nil,
let image = UIImage(data: data)
else { return }
DispatchQueue.main.async() { () -> Void in
self.image = image
}
}.resume()
}
приведенный ниже код работал для меня, улов устанавливает URLCache в ноль.
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
config.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
config.URLCache = nil;
вам нужно установить cachePolicy
on NSURLRequest
, вот документация.
вот некоторое представление о том, как работает кэширование в целом.
вы можете прочитать о конкретных перечислениях, которые вы можете использовать для указания cachePolicy
здесь в частности:
enum
{
NSURLRequestUseProtocolCachePolicy = 0,
NSURLRequestReloadIgnoringLocalCacheData = 1,
NSURLRequestReturnCacheDataElseLoad = 2,
NSURLRequestReturnCacheDataDontLoad = 3,
};
typedef NSUInteger NSURLRequestCachePolicy;
например, вы бы сделали:
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60.0];
Я получал изображение кэша для того же url .. Итак, я сделал это
imageView.imageFromUrl(self.shareData.userResponseData["photo"] as! String)
extension UIImageView {
public func imageFromUrl(urlString: String) {
if let url = NSURL(string: urlString) {
let request = NSURLRequest(URL: url, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData, timeoutInterval: 60.0)
NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) {
(response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in
self.image = UIImage(data: data)
}
}
}
}