在苹果的文件中,苹果说:
重要:多个人不能使用ABAddressBookRef的实例 线程。每个线程都必须创建自己的实例。
并且
记录对象不能安全地传递给线程。相反,你 应该传递相应的记录标识符
第一个是什么意思?如果我能确保每一刻只有一个线程正在访问ABAddressBookRef,我可以在多个线程中使用这个ABAddressBookRef吗?
第二个,什么不能安全地通过线程传递真正的意思?
似乎GCD不保证所有块都在同一个线程中被执行,即使这些块在同一个串行队列中也是如此。
这是否意味着我不能使用GCD来处理ABAddressBook框架? 或者我只能在每个块中创建一个ABAddressBookRef?(我已经测试过了,真的很慢)
答案 0 :(得分:2)
This question涵盖同一问题。这并不是说ABAddressBook不是线程安全的,它意味着你根本不能使用多线程。
但是,您可以使用getter / setter方法编写一个包装类来执行您需要的操作,可以从调度块内的任意线程调用它。包装器中的所有“变异”函数都必须在同一个线程上发生。也许可以考虑查看dispatch_once文档,了解如何使用grand-central来防止多实例化。