NSData dataWithContentsOfURL缓存

时间:2010-08-23 15:12:36

标签: iphone caching nsdata

NSData + dataWithContentsOfURL默认有任何缓存吗? 有没有人使用这种方法试验过某种问题,从网上获取数据的最有效方法是什么?

5 个答案:

答案 0 :(得分:8)

使用ASIHTTPRequest。它是第三方HTTP客户端库,使网络交互更简单,并具有非常好的缓存功能。

更新:刚刚回答了这个答案,这是一个很好的提示,可以回来更新。自2010年8月以来,地段发生了变化。最值得注意的是:ASIHTTPRequest现已弃用,其作者鼓励人们使用其他东西。 AFNetworking似乎是一个受欢迎的选择。

答案 1 :(得分:5)

最好使用NSURLConnection。您提供的NSURLRequest可以配置为以您希望的方式执行缓存,但默认情况下,它只会对其响应中具有相应标头的HTTP资源执行标准缓存。

这就是我的所作所为:

NSData *data = [NSURLConnection sendSynchronousRequest:
                [NSURLRequest requestWithURL:url]
                                     returningResponse:nil
                                                 error:&error];

确保将它放在一个不是主队列的NSOperationQueue中,或以其他方式从主线程卸载它。或者,使用异步请求。

答案 2 :(得分:5)

似乎在iPhone5s上默认策略是缓存(unlinke iPhone5及更早版本)。

您可以通过options参数处理NSData的缓存策略。例如,如果要避免缓存,可以使用以下剪切:

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

答案 3 :(得分:3)

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

您想获得哪种数据

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

视频:您应该使用MPMoviePlayerController进行流式传输

文字:我认为你可以正常NSUrlConnection。它还具有异步,同步和缓存

答案 4 :(得分:-1)

如果您需要的只是从网址下载图片,不要费心使用任何库,只需一个简单的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];
    });
});