4

当我阅读关于

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 来缓存数据?这种理解正确吗?

4

2 回答 2

7

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

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

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

底线:不要使用这些 API

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

于 2013-07-24T13:22:50.207 回答
4

您的具体问题是指由 URL 加载系统管理的缓存,没有答案。

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

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

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

于 2013-07-26T07:46:04.503 回答