60

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

这是由于缓存吗?我怎么知道NSURLSessionTask不使用缓存。

这是我使用的调用:

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

谢谢!

4

8 回答 8

82

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

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

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

let session = URLSession(configuration: config)

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

于 2017-03-10T15:47:49.427 回答
39

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

@property (nonatomic, strong) NSURLSession *session;

接着:

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

然后使用该会话的请求将使用该requestCachePolicy.

于 2014-06-20T14:13:22.057 回答
29

斯威夫特 4 & 5

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

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

随着文档的进行,

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

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

let configuration = URLSessionConfiguration.ephemeral
let session = URLSession(configuration: configuration)
于 2019-03-08T10:26:36.410 回答
8

斯威夫特 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()
}
于 2017-01-25T11:00:52.037 回答
5

下面的代码对我有用,问题是将 URLCache 设置为 nil。

 NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
    config.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
    config.URLCache = nil;
于 2016-09-16T05:41:19.927 回答
0

您需要设置cachePolicyon NSURLRequest,这是文档

以下是关于缓存一般如何工作的一些见解

您可以阅读有关可用于特别指定cachePolicy 此处的特定枚举:

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

例如,你会这样做:

NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:60.0];
于 2014-06-20T13:57:03.237 回答
0

使用 http 方法POST,例如:

  var request = URLRequest(url: ulr)
  request.httpMethod = "POST"
于 2022-01-01T08:29:28.497 回答
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)

        }
    }
}

}

于 2015-09-03T11:44:29.963 回答