为什么需要为每个线程创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
。