苹果说:
重要提示:ABAddressBookRef 的实例不能被多个使用
线程。每个线程必须创建自己的实例。
But why?
我知道某些特定的类或操作必须在主线程中完成。
而且我知道有些对象不是线程安全的(这意味着如果这些对象同时被两个不同的线程访问,则会导致问题)。
但是,如果您可以确保线程不安全的对象在任何时刻都只能由一个线程访问,那么应该没有问题。
到目前为止我理解正确吗?
我不明白的是,为什么需要为每个线程创建一些像 ABAddressbookRef 这样的对象?为什么苹果会说出这样的话呢?如果只是线程不安全,苹果可以说它是线程不安全的,处理的时候要小心。但为什么需要为每个线程创建一个呢?难道还有什么我不知道的理由吗?
ABAddressbookRef 的实现是否依赖于创建它的线程?
PS:我记得核心数据还说需要为使用它的每个线程创建 ManagedObjectContext 。
为了结束猜测,我使用付费支持向 Apple 询问有关 ABAddressBookRef 和多线程的明确答案。
这是我问的:
关于这个问题有很多猜测,我决定向一位非常了解ABAddressBook框架实现细节的工程师寻求一个明确的答案。
文档指出:
重要事项 ABAddressBookRef 的实例不能由多个线程使用。每个线程必须创建自己的实例。
如果我从字面上理解,这意味着即使使用 GCD 串行队列,也必须在每个块中创建 ABAddressBookRef,因为 GCD 不对全局主线程之外的线程提供任何保证。
我想问这是否就是字面上的意思,或者是否足以确保没有两个线程在任何时刻同时访问同一个 ABAddressBookRef,这是 GCD 专用串行队列所保证的。
这是我从苹果得到的回报。
感谢您联系 Apple 全球开发者技术支持。我回复您是为了让您知道我已收到您的技术援助请求。
那是对的。这是因为地址簿对象永远不应该跨越线程边界。因此,每个块必须有自己的实例。
这是个坏消息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)