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

时间:2011-08-10 15:26:06

标签: ios thread-safety abaddressbook

Apple说:

  

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

但为什么?

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

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:12)

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

以下是我的问题:

  

对此事有很多猜测,我决定要求一位了解ABAddressBook Framework实施细节的工程师给出一个明确的答案。

     

文件说明:   多个线程无法使用ABAddressBookRef的重要实例。每个线程都必须创建自己的实例。

     

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

     

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

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

  

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

这是个坏消息。

答案 1 :(得分:2)

  

但是如果你能确保线程不安全的对象在任何时候只能由一个线程访问,那么就没有问题了。

是的,这正是Apple告诉你要做的事情:

  

多个线程无法使用ABAddressBookRef 的实例

正如您所指出的那样,原因是那些ABAddressBookRef 对象(实际上是c结构)不是线程安全的。您还可以使用ABAddressBookRef

添加锁以确保不会有两个线程同时访问{for read of write} @synchronized(addressBookRef) { }