Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.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 防止initWithContentsOfURL:使用缓存_Ios_Objective C_Cocoa Touch_Url_Caching - Fatal编程技术网

Ios 防止initWithContentsOfURL:使用缓存

Ios 防止initWithContentsOfURL:使用缓存,ios,objective-c,cocoa-touch,url,caching,Ios,Objective C,Cocoa Touch,Url,Caching,我使用此行获取URL的内容: NSString *result=[[NSString alloc] initWithContentsOfURL:[NSURL URLWithString:URL] encoding:NSUTF8StringEncoding error:nil]; 问题是当存在坏连接

我使用此行获取URL的内容:

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

问题是当存在坏连接时,它会从缓存加载内容。有没有办法避免这种行为?例如,清除缓存或其他东西。

简单的cache-buster伪参数,将随机值添加到URL应该可以工作。
正如@Josh Caswell所说,使用
NSURLRequest
。尽管对于代理服务器,仅使用
NSURLRequest
可能没有帮助,您仍然需要缓存buster。

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

其次,如果要控制缓存行为,应该使用
NSURLRequest
NSURLRequest
允许您通过设置请求的
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

的实例。无论如何,对于网络操作,您不应该使用
initWithContentsOfURL:
。使用
NSURLRequest
。如果使用NSURLRequest,则可以关闭缓存,这样就不会缓存任何内容。请给我一个如何从NSURLRequest加载字符串的示例?这里几乎完整的源代码好的,我使用了它,它工作得很好,但当连接不好时,它仍会加载以前的结果。您是否认为服务器正在从其缓存(如果存在)进行响应。我使用的是一个简单的php脚本,它会回显xml文件的内容。这是可能的,特别是如果您的脚本托管在缓存负载平衡器或CDN后面。解决此问题的最佳方法是使用Charles之类的调试代理,并在应用程序运行时运行该代理。您将能够准确地看到来自服务器的内容。我通过将此标题添加到脚本中解决了此问题:header(“缓存控制:无缓存,必须重新验证”);非常感谢您的帮助。如果您控制了服务器,这绝对是获得您想要的行为的正确方法。不需要重新验证。您可以使用