为什么需要为每个线程创buildABAddressbookRef?

苹果说:

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

但为什么?

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

而且我知道一些对象不是线程安全的(这意味着如果这些对象被两个不同的线程同时访问,将会导致问题)。

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

我到目前为止是否理解正确?

我不明白的是,为什么会像ABAddressbookRef这样的对象需要为每个线程创build? 为什么苹果会这样说呢? 如果只是线程不安全,苹果可能会说这是线程不安全的,处理时要小心。 但为什么需要为每个线程创build一个? 有什么理由我不知道吗?

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

PS:我记得核心数据还说,需要为每个使用它的线程创buildManagedObjectContext。

为了结束我使用付费支持的猜测,请求苹果有关ABAddressBookRef和多个线程的明确答案。

这是我问:

关于这个问题已经有很多的猜测,我决定请一位熟知ABAddressBook Framework实现细节的工程师给出明确的答案。

该文档指出:ABAddressBookRef的重要实例不能由多个线程使用。 每个线程都必须创build自己的实例。

如果我从字面上看,这意味着即使使用GCD串行队列,也必须在每个块中创buildABAddressBookRef,因为GCD并没有对全局主线程旁边的线程给出任何保证。

我想问一下,如果这是字面意思,或者,确保没有两个线程同时在GCD专用串行队列确保的任何时刻同时访问同一个ABAddressBookRef。

这就是我从苹果公司得到的回报。

感谢您联系Apple全球开发者技术支持。 我正在回应,让您知道我收到了您的技术援助请求。 那是对的。 这是因为地址簿对象不应该跨越线程边界。 因此,每个块必须有它自己的实例。

这是个坏消息。

但是如果你能保证线程不安全的对象只能在一个线程中随时访问,那么就没有问题了。

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

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

原因,正如你所指出的那样,那些ABAddressBookRef 对象 (实际上是c结构)不是线程安全的。 您还可以添加locking,以确保两个线程同时使用@synchronized(addressBookRef) { }访问(读写) ABAddressBookRef