NSURLCache线程安全吗?

Pei*_*Pei 6 multithreading caching nsurlcache ios urlsession

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

bbu*_*bum 10

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

(文档没有提及线程.因此,不是线程安全的.)

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


Kas*_*nck 6

请允许我将这两个精彩的答案合并为第三个答案,现在提及更新的文档:

线程安全

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

虽然NSURLCache实例方法可以安全地从多个执行上下文同时呼吁,要知道,类似的方法cachedResponseForRequest:,并storeCachedResponse:forRequest: 试图读取或写入相同请求的响应时,有一个不可避免的竞争条件.

NSURLCache的子类必须以这种线程安全的方式实现重写方法.

也就是说,除非你明确地调用cachedResponseForRequest:,storeCachedResponse:forRequest:或者其他"方法相似" ,否则你将跨线程安全.这些"类似"的方法,似乎是一个留给读者的练习,但是既然你会遇到"不可避免的竞争条件",你很有可能最终弄明白:-)


Mik*_*lah 4

通常我会采取@bbum的立场,但如果NSURLCache不同意的话。

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

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

仍然希望将其正式记录下来,介意!