我从通讯簿文档中的感觉和我对底层 CoreData 实现的理解表明通讯簿应该是线程安全的,并且从多个线程进行查询应该没有问题。但是我在文档中找不到任何关于线程安全的明确讨论。这提出了几个问题:
- 在多个线程上使用 +sharedAddressBook 进行只读访问是否安全?我相信答案是肯定的。
- 对于后台线程的写访问,您似乎应该使用 +addressBook 代替(并手动保存您的更改)。我理解正确吗?
- 有没有人调查过在多个线程上对通讯簿进行多个同时查询对性能的影响?这应该与在多个线程上进行多个 CoreData 查询的性能非常相似。我的感觉是,通过并行查询我不会获得什么好处,因为我假设它们在遇到 SQLLite 时会序列化,但我在这里不确定。
我需要对 AddressBook 进行数十次查询(有些复杂),并且正在使用 NSOperation 在后台线程上执行此操作以避免阻塞 UI(它目前正在这样做)。我的基本问题是将最大并发操作设置为大于 1 的值是否有意义,以及如果应用程序也可能同时在另一个线程上写入 AddressBook 是否有任何危险。