为什么需要为每个线程创建ABAddressbookRef?

Jim*_*mmy 9 thread-safety abaddressbook ios

Apple说:

重要:多个线程不能使用ABAddressBookRef的实例.每个线程都必须创建自己的实例.

但为什么?

我知道必须在主线程中完成一些特定的类或操作.

我知道有些对象不是线程安全的(这意味着如果这两个不同的线程同时访问这些对象会导致问题).

但是,如果你可以确保任何时刻只有一个线程访问线程不安全的对象,那么应该没有问题.

到目前为止我能理解正确吗?

我无法理解的是,为什么需要为每个线程创建像ABAddressbookRef这样的对象?为什么苹果会说这样的话?如果它只是线程不安全,Apple可以说它不安全,在处理它时要小心.但为什么需要为每个线程创建一个?我有什么理由不知道吗?

ABAddressbookRef的实现是否依赖于创建它的线程?

PS:我记得Core Data还说需要为每个使用它的线程创建ManagedObjectContext.

sve*_*ena 12

为了结束推测,我使用付费支持向Apple询问有关ABAddressBookRef和多线程的明确答案.

这是我问的问题:

关于这个问题有很多猜测,我决定要求一位了解ABAddressBook Framework实现细节的工程师给出一个明确的答案.

文档说明:多个线程不能使用ABAddressBookRef的重要实例.每个线程都必须创建自己的实例.

如果我从字面上理解这意味着,即使使用GCD串行队列,也必须在每个块中创建ABAddressBookRef,因为GCD不对全局主线程旁边的线程提供任何保证.

我想问一下这是不是它的意思,或者,它是否足以确保在GCD专用串行队列确保的任何时刻没有两个线程同时访问同一个ABAddressBookRef.

以下是我从Apple获得的回报.

感谢您联系Apple Worldwide Developer技术支持.我的回复是让您知道我已收到您的技术协助请求.那是正确的.这是因为地址簿对象永远不应跨越线程边界.因此,每个块必须具有自己的实例.

这是坏消息.


Jav*_*oto 2

但是,如果您可以确保线程不安全的对象在任何时刻只能由一个线程访问,那么就不会有问题。

是的,这正是苹果告诉你要做的:

ABAddressBookRef 的实例不能被多线程使用

正如您所指出的,原因是这些ABAddressBookRef 对象(实际上是 C 结构)不是线程安全的。您还可以添加锁以确保没有两个线程同时访问(用于读取或写入)a ABAddressBookRef,使用@synchronized(addressBookRef) { }