NSData dataWithContentsOfURL cache

9

NSData +dataWithContentsOfURL默认具有任何类型的缓存吗? 有人尝试使用此方法时遇到了什么问题,从网络获取数据的最有效方式是什么?

5个回答

8
使用ASIHTTPRequest。它是一个第三方的HTTP客户端库,可以使网络交互更加简单,并且具有非常好的缓存功能。
更新:刚刚收到了这个答案的负评,这提醒我回来更新一下内容。自2010年8月以来,许多东西发生了变化。最值得注意的是:ASIHTTPRequest现在已被弃用,其作者正在鼓励人们使用其他工具。AFNetworking似乎是一个流行的选择。

1
将我的负评改成了正评。显然这与个人无关,我只是不想让别人认为这仍然是一个好答案。更新得很好,干得好! :) - Steven Fisher
@StevenFisher - 我在我的SO历史记录中热情推荐ASIHTTPRequest的次数令人震惊。我指望着获得负评来帮助我找到它们的全部! - Dan Ray
您可能需要考虑删除答案,至少在这种情况下...我认为您不必再回顾一遍所有内容。 - Kendall Helmstetter Gelner
@KendallHelmstetterGelner - 或许很快就会不再有类似“ASI确实是正确的选择,但现在并非如此”的答案对你有用了。我不能确定确切的时间点是什么时候。我还是看到很多关于ASI的问题在流传。 - Dan Ray

6

似乎在 iPhone5s 上,缺省策略是进行缓存(不同于iPhone5及之前的版本)。

你可以通过 options 参数来处理 NSData 的缓存策略。例如,如果你想要避免缓存,可以使用以下代码片段:

[[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:url] options:NSDataReadingUncached error:nil];

5
最好使用NSURLConnection。您提供给它的NSURLRequest可以配置为按照您想要的方式进行缓存,但默认情况下,它只会对具有响应中适当标头的HTTP资源进行标准缓存。
这是我做的:
NSData *data = [NSURLConnection sendSynchronousRequest:
                [NSURLRequest requestWithURL:url]
                                     returningResponse:nil
                                                 error:&error];

请确保将此代码放入一个非主队列的NSOperationQueue中,或以其他方式从主线程卸载它。另外,您也可以使用异步请求的方式。


3

文档没有说明它会缓存,所以我认为我们应该假设它们不会进行任何缓存。

您希望获取哪些类型的数据

UIImage:是的,我认为您应该使用NSData

视频:您应该使用MPMoviePlayerController进行流媒体

文本:我认为您可以使用普通的NSUrlConnection。它还具有异步、同步和缓存功能。


我需要获取XML格式的配置文件,我应该使用NSUrlConnection,对吗? - cesarnicola
是的,我认为你应该使用NSUrlConnection并进行异步操作以防止阻塞UI。 - vodkhang

-1
如果你只需要从URL下载图像,不必使用任何库,只需一个简单的dispatch_async调用即可。像这样:
dispatch_async( dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0 ), ^(void)
{
    NSData * data = [NSData dataWithContentsOfURL:imageUrl];
    dispatch_async( dispatch_get_main_queue(), ^(void){
        self.image = [UIImage imageWithData:data];
    });
});

1
问题在于图像没有被缓存,因此如果同一张图像在多个地方重复使用,这种方法会增加网络负担。 - Van Du Tran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接