GCD是否确保在同一队列中工作的所有块始终在同一个线程中工作?
如果我为此队列创建一个调度队列和dispath_async块,那么调度到该队列的所有块是否都在同一个线程中工作?
由于我正在开发一个使用ABAdrressbook Framerowk的项目,并且该文档说不能在线程之间使用ABAddressBookRef和ABRecordRef,所以我想知道队列中的所有块是否都在同一个线程中,我可以创建该队列只有一个AddressBookRef。
答案 0 :(得分:6)
绑定到特定线程的唯一队列是主队列,它绑定到主(UI)线程。
如果唯一的要求是不同时访问对象,那么使用串行队列应该可以正常工作。
如果对象依赖于线程本地状态,则必须强制所有操作到特定线程。最简单的方法是将你的串行队列定位到主线程,但只有当你知道你不会长时间陷入困境时才会有效。否则,您将挂起您的UI。在这种情况下,您将必须创建自己的处理程序线程并在那里发送工作。
答案 1 :(得分:4)
队列不受任何特定约束 执行线程
无法保证发送到串行队列的所有块都被发送到同一个线程。我找不到任何ABAddressBookCreate与GCD串行队列组合的源代码......
答案 2 :(得分:0)
当文档说某些东西不能在线程之间使用时,它只意味着API不能同时从不同的线程同时使用。 API本身不会记住关于调用它的线程或类似的东西的任何特殊内容,并且每次强制它都是相同的。
在GCD之前,您将使用@synchronize序列化对共享资源的访问。正如您自己建议的那样,为此创建队列是另一种序列化对此资源的访问的方式,这种方式更有效。