6

我知道NSCache是线程安全的,但是我找不到提到的任何NSURLCache线程安全的文档。

4

3 回答 3

11

除非文档明确说明这NSURLCache是线程安全的,否则它不是线程安全的。

(文档对线程只字未提。因此,不是线程安全的。)

并且总是不时地再次检查文档。自从我写了这个答案以来,线程安全规则已经改变。

于 2014-02-13T00:30:39.787 回答
7

请允许我将两个出色的答案合并到第三个答案中,现在参考更新的文档

线程安全

在 iOS 8 及更高版本以及 macOS 10.10 及更高版本中,NSURLCache 是线程安全的。

尽管 NSURLCache 实例方法可以安全地同时从多个执行上下文中调用,但请注意,在尝试读取或写入同一请求的响应时,方法喜欢cachedResponseForRequest:storeCachedResponse:forRequest: 具有不可避免的竞争条件。

NSURLCache 的子类必须以这种线程安全的方式实现被覆盖的方法。

也就是说,除非您显式调用或其他“类似方法” cachedResponseForRequest:,否则storeCachedResponse:forRequest:跨线程将是安全的。这些是什么“方法”似乎是留给读者的练习,但是由于您会遇到“不可避免的竞争条件”,因此您很有可能最终会弄清楚:-)

于 2016-10-20T08:36:43.357 回答
4

通常我会对此采取@bbum 的立场,但在NSURLCache不同意的情况下。

NSURLConnection是线程安全的,因为可以在您选择的线程上调度给定实例(但不要尝试在多个线程上调度单个实例!)

默认情况下,连接都与+[NSURLCache sharedCache]. 从逻辑上讲,这意味着要么NSURLCache本身是线程安全的,要么提供客户端可以显式调用自己的锁定机制。由于后者不存在,我推断NSURLCache是线程安全的。

请注意,仍然希望将其正式记录在案!

于 2014-02-17T09:32:29.203 回答