Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何从NSURLSessionTask禁用缓存_Ios_Caching_Nsurlsessiontask - Fatal编程技术网

Ios 如何从NSURLSessionTask禁用缓存

Ios 如何从NSURLSessionTask禁用缓存,ios,caching,nsurlsessiontask,Ios,Caching,Nsurlsessiontask,在我的iOS应用程序中,我使用NSURLSessionTask将json数据下载到我的应用程序中。我发现,当我直接从浏览器调用url时,我会得到一个最新的json,当从应用程序内部调用它时,我会得到一个旧版本的json 这是因为缓存吗?如何告诉NSURLSessionTask不要使用缓存 这是我使用的呼叫: NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(

在我的iOS应用程序中,我使用
NSURLSessionTask
将json数据下载到我的应用程序中。我发现,当我直接从浏览器调用url时,我会得到一个最新的json,当从应用程序内部调用它时,我会得到一个旧版本的json

这是因为缓存吗?如何告诉
NSURLSessionTask
不要使用缓存

这是我使用的呼叫:

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

谢谢

您需要在
NSURLRequest
上设置
cachePolicy
,下面是

总的来说

您可以阅读有关可用于指定
cachePolicy
的特定枚举的信息,尤其是:

enum
{
   NSURLRequestUseProtocolCachePolicy = 0,
   NSURLRequestReloadIgnoringLocalCacheData = 1,
   NSURLRequestReturnCacheDataElseLoad = 2,
   NSURLRequestReturnCacheDataDontLoad = 3,
};
typedef NSUInteger NSURLRequestCachePolicy;
例如,您将执行以下操作:

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

除了使用
sharedSession
,您还可以使用指定默认缓存策略的
NSURLSessionConfiguration
创建自己的
NSURLSession
。因此,请为会话定义一个属性:

@property (nonatomic, strong) NSURLSession *session;
然后:

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

然后使用该会话的请求将使用我为同一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)

        }
    }
}

}下面的代码对我有效,catch将URLCache设置为nil

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

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

如果您从@runmad读取链接,您可以在流程图中看到,如果文件头未更改,则在设置缓存策略时仍将使用缓存版本

在Swift3中,我必须这样做才能让它工作:

let config=URLSessionConfiguration.default
config.requestCachePolicy=.reloadIgnoringLocalCacheData
config.urlCache=nil
let session=URLSession(配置:config)

这得到了一个真正的非缓存版本的文件,我需要它来计算带宽。

Swift 4&5

我知道这已经有一段时间了,但以防将来可能会对某人有所帮助

您还可以使用
URLSession
.ephemeral
配置属性,默认情况下不会保存任何cookie和缓存

正如文件所述

临时会话配置对象与默认会话配置类似,只是相应的会话对象不将缓存、凭据存储或任何会话相关数据存储到磁盘。相反,会话相关数据存储在RAM中

因此,您的代码可能如下所示:

let configuration = URLSessionConfiguration.ephemeral
let session = URLSession(configuration: configuration)

我正在使用NSURLSession。这似乎对我不起作用。至少不是在iOS模拟器中。已尝试关闭internet连接,但它会返回缓存的答复。请看一看mu问题,我发现我们还需要将
URLCache
设置为
nil
我们可以执行您编写的操作还是将cache设置为
nil
?或者我们必须包括
NSURLRequestReloadIgnoringLocalCacheData
?还有,为什么不使用短暂的会话呢?这太棒了!你节省了我的时间!如果您拥有API服务器,则可能需要考虑在该端上修复缓存头。URLSessionTasks应该遵守标题,因此可能有些设置不正确。奇怪的是,我会认为urlCache默认为零。从5个小时以来我一直在思考这个问题,已保存thanks@VanDuTranFrom:“对于默认会话,默认值是共享URL缓存对象。”这意味着,如果您不指定任何内容,那么它只会使用共享会话中提供给您的相同缓存。知道如何删除/禁用缓存“缓存”文件夹中的db文件吗?再次感谢。不知什么原因,在会话datatask completionHandler中收到响应后不久,我仍然必须添加“URLCache.shared.removeAllCachedResponses()”。现在它没有显示文件夹“fsCachedData”,这正是我想要的