【问题标题】:Prevent initWithContentsOfURL: from using cache防止 initWithContentsOfURL: 使用缓存
【发布时间】:2014-11-02 01:21:39
【问题描述】:

我正在使用这一行来获取 URL 的内容:

NSString *result=[[NSString alloc] initWithContentsOfURL:[NSURL URLWithString:URL]
                                                encoding:NSUTF8StringEncoding 
                                                   error:nil];

问题是当连接不好时,它会从缓存中加载内容。有没有办法避免这种行为?比如清缓存什么的。

【问题讨论】:

  • 无论如何,您都不应该使用initWithContentsOfURL: 进行网络操作。使用NSURLRequest
  • 如果你使用 NSURLRequest,你可以关闭缓存,这样就不会缓存任何东西。

标签: ios objective-c cocoa-touch url caching


【解决方案1】:

首先,不建议使用initWithContentsOfURL:encoding:error 从网络资源加载数据。

其次,如果你想控制缓存行为,你应该使用NSURLRequestNSURLRequest 允许您通过设置请求的cachePolicy 来自定义请求的缓存行为。在您的情况下,您想使用NSURLRequestReloadIgnoringLocalCacheData。使用NSURLConnection 同步执行此操作的示例是:

NSString        *result     = nil;
NSData          *data       = nil;
NSURLResponse   *response   = nil;
NSURLError      *error      = nil;
NSURLRequest    *request    = [[NSURLRequest alloc] initWithURL:URL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20L];
data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
if (response != nil && [data length] > 0){
    result = [NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}

请注意,这是一个非常幼稚的实现,它不会检查返回的 HTTP 状态代码、响应的 mime 类型或执行任何错误处理。同步加载网络资源或从主线程加载也不是推荐的做法。更好的实现将使用sendAsynchronousRequest:completion:NSURLSession

但是,它确实从高层次上演示了您需要做什么才能回答您的问题:NSURLRequest 指定此请求不应使用本地缓存,并且返回的数据用于创建NSString 的实例.

【讨论】:

  • 好的,我用过它,它工作得很好,但是当连接不好时,它仍然会加载以前的结果。您是否认为服务器正在从其缓存中响应(如果存在)。我正在使用一个简单的 php 脚本来回显 xml 文件的内容。
  • 这是可能的,尤其是当您的脚本托管在缓存负载均衡器或 CDN 后面时。解决此问题的最佳方法是使用像 Charles 这样的调试代理,并在您的应用程序运行时运行它。您将能够准确地看到来自服务器的内容。
  • 我通过将此标头添加到我的脚本来解决它: header("Cache-Control: no-cache, must-revalidate");无论如何,非常感谢您的帮助。
  • 如果您可以控制服务器,那绝对是获得您想要的行为的正确方法。 must-revalidate 应该是不必要的。您可以使用red-bot.org 检查您的脚本
【解决方案2】:

将随机值添加到 URL 的简单缓存破坏器虚拟参数应该可以工作。 正如@Josh-Caswell 所说,使用NSURLRequest。尽管在代理服务器的情况下,仅使用 NSURLRequest 可能无济于事,您仍然需要缓存破坏器。

【讨论】:

猜你喜欢
  • 2015-11-06
  • 2011-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-19
  • 2020-05-27
  • 2015-04-10
  • 1970-01-01
相关资源
最近更新 更多