Подтвердить что ты не робот

Как отключить кеширование из NSURLSessionTask

В моем приложении iOS я использую NSURLSessionTask для загрузки json-данных в свое приложение. Я обнаружил, что когда я вызываю URL-адрес непосредственно из браузера, я получаю обновленный json и когда он вызывается из приложения, я получаю более старую версию json.

Это из-за кеширования? Как я могу сказать NSURLSessionTask не использовать кеширование.

Это вызов, который я использую:

NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

Спасибо!

4b9b3361

Ответ 1

Если вы прочитали ссылки из @runmad, вы можете увидеть в блок-схеме, что если HEAD файла неизменен, он все равно будет использовать кешированную версию при настройке cachePolicy.

В Swift3 я должен был сделать это, чтобы заставить его работать:

let config = URLSessionConfiguration.default
config.requestCachePolicy = .reloadIgnoringLocalCacheData
config.urlCache = nil

let session = URLSession.init(configuration: config)

Это получило действительно не кэшированную версию файла, которая мне нужна для расчета оценки пропускной способности.

Ответ 2

Вместо sharedSession вы также можете создать свой собственный NSURLSession с помощью NSURLSessionConfiguration, который задает политику кэширования по умолчанию. Итак, определите свойство для вашей сессии:

@property (nonatomic, strong) NSURLSession *session;

И затем:

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
configuration.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
self.session = [NSURLSession sessionWithConfiguration:configuration];

Затем запросы, использующие этот сеанс, будут использовать requestCachePolicy.

Ответ 3

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()
}

Ответ 4

Приведенный ниже код работал у меня, catch устанавливает URLCache в nil.

 NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    config.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
    config.URLCache = nil;

Ответ 5

Вам нужно установить cachePolicy на NSURLRequest, здесь documentation.

Вот некоторые сведения о том, как работает кеширование в целом.

Вы можете прочитать о конкретных перечислениях, которые вы можете использовать для указания cachePolicy здесь в частности:

enum
{
   NSURLRequestUseProtocolCachePolicy = 0,
   NSURLRequestReloadIgnoringLocalCacheData = 1,
   NSURLRequestReturnCacheDataElseLoad = 2,
   NSURLRequestReturnCacheDataDontLoad = 3,
};
typedef NSUInteger NSURLRequestCachePolicy;

Например, вы бы сделали:

NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60.0];

Ответ 6

Я получал изображение кэша для одного и того же 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)

        }
    }
}

}