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技术支持.我的回复是让您知道我已收到您的技术协助请求.那是正确的.这是因为地址簿对象永远不应跨越线程边界.因此,每个块必须具有自己的实例.
这是坏消息.
但是,如果您可以确保线程不安全的对象在任何时刻只能由一个线程访问,那么就不会有问题。
是的,这正是苹果告诉你要做的:
ABAddressBookRef 的实例不能被多线程使用
正如您所指出的,原因是这些ABAddressBookRef 对象(实际上是 C 结构)不是线程安全的。您还可以添加锁以确保没有两个线程同时访问(用于读取或写入)a ABAddressBookRef,使用@synchronized(addressBookRef) { }
| 归档时间: |
|
| 查看次数: |
2267 次 |
| 最近记录: |