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

DrB*_*Bug 4 nsurlconnection nsdata ios

当我阅读该部分时

NSDataReadingOptions
Options for methods used to read NSData objects.

enum {
   NSDataReadingMappedIfSafe = 1UL << 0,
   NSDataReadingUncached = 1UL << 1,
   NSDataReadingMappedAlways = 1UL << 3,
};
typedef NSUInteger NSDataReadingOptions;
Run Code Online (Sandbox Code Playgroud)

它说

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

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

Way*_*man 7

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

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

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

底线:不要使用这些API.

请像NSURLConnection或那样使用异步网络AFNetworking.这些类旨在以不影响用户体验的方式高效地获取数据.更好的是它们处理您最初询问的特定用例:如何阻止它在磁盘上缓存?.