是NSData +(id)dataWithContentsOfURL:(NSURL *)aURL选项:(NSDataReadingOptions)掩码错误:(NSError **)errorPtr:自动缓存?

时间:2013-07-24 11:40:15

标签: ios nsurlconnection nsdata

当我阅读

部分时
NSDataReadingOptions
Options for methods used to read NSData objects.

enum {
   NSDataReadingMappedIfSafe = 1UL << 0,
   NSDataReadingUncached = 1UL << 1,
   NSDataReadingMappedAlways = 1UL << 3,
};
typedef NSUInteger NSDataReadingOptions;

它说

NSDataReadingUncached 指示文件的提示不应存储在文件系统缓存中。 对于一次读取和丢弃的数据,此选项可以提高性能。 适用于OS X v10.6及更高版本。 在NSData.h中声明。

所以我假设默认情况下这些URL请求被缓存,如果我想使用共享全局缓存,则不需要实现NSURLRequest来缓存数据?这种理解是否正确?

2 个答案:

答案 0 :(得分:6)

首先我要说dataWithContentsOfURL:options:error:及其类似可能是从网络中获取内容的最糟糕的API。它们对开发人员非常有吸引力,因为他们可以通过一行代码从网络中获取资源,但是它们带来了一些非常有害的副作用:

首先,它们阻止调用它们的线程。这意味着如果您在主线程(可以更新UI的唯一线程)上执行此操作,那么您的应用程序将显示为用户冻结。这是一个非常大的“不,没有”。从用户体验的角度来看。

其次,您无法取消这些请求,因此即使您将此请求放在后台线程上,即使数据可能不再有用,它也会继续下载。例如,如果您的用户到达视图控制器并且您执行此请求并且用户随后决定点击后退按钮,则该数据将继续下载,即使它不再相关。

底线: 请勿使用这些API

请使用NSURLConnectionAFNetworking等异步网络。这些类旨在以不会影响用户体验的方式有效地获取数据。更好的是他们处理您最初询问的具体用例:how do I stop it from caching on disk?

答案 1 :(得分:3)

您的特定问题没有答案,该问题涉及由URL加载系统管理的缓存。

方法dataWithContentsOfFile:options:error:中的阅读选项仅指从文件系统中读取(请参阅NSDataReadingOptions的官方文档。)

不幸的是,文档没有提供有关从远程资源读取时的行为的提示。响应是否缓存在URL缓存中是未指定的 - 也就是说,我们不知道,并且内部行为和实现可能随每个新的OS版本而改变。

恕我直言,我们一般应该避免使用“方便的方法”来读取远程资源。看来,这些方法在访问远程资源时只能通过“意外”工作。所以,我非常同意@Wayne Hartman;)

相关问题