如何从NSURLSessionTask禁用caching
在我的iOS应用程序中,我使用NSURLSessionTask
将json数据下载到我的应用程序。 我发现,当我直接从浏览器调用url时,我得到一个最新的json,当它从应用程序中调用时,我得到一个老版本的json。
这是由于caching? 我怎么能告诉NSURLSessionTask
不使用caching。
这是我使用的呼叫:
NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
谢谢!
如果从@runmad读取链接,您可以在stream程图中看到,如果文件的HEAD未更改,则在设置cachePolicy时仍会使用caching的版本。
在Swift3中,我必须这样做才能使其工作:
let config = URLSessionConfiguration.default config.requestCachePolicy = .reloadIgnoringLocalCacheData config.urlCache = nil let session = URLSession.init(configuration: config)
这有一个真正的非caching版本的文件,我需要带宽估计计算。
您可以使用指定默认caching策略的NSURLSessionConfiguration
创build自己的sharedSession
,而不是使用sharedSession
。 所以,为你的会话定义一个属性:
@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;
你需要在NSURLRequest
上设置cachePolicy
,这里是文档 。
以下是关于一般caching如何工作的一些见解 。
您可以阅读有关可用于指定cachePolicy
的具体枚举:
enum { NSURLRequestUseProtocolCachePolicy = 0, NSURLRequestReloadIgnoringLocalCacheData = 1, NSURLRequestReturnCacheDataElseLoad = 2, NSURLRequestReturnCacheDataDontLoad = 3, }; typedef NSUInteger NSURLRequestCachePolicy;
例如,你会做:
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60.0];
我得到的caching图像相同的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) } } }
}