Utility.managedObjectContext().performBlockAndWait({

})

dispatch_sync(dispatch_get_main_queue(), {

})



好奇上面的两个代码有什么区别?上下文是使用.MainQueueConcurrencyType选项创建的。
如果我在主队列上执行块,队列是否按FIFO顺序执行?还是它们可以重叠,操作混杂?即(a1,a2,a3),(b1,b2,b3)可以得到(a1,b1,a2,a3,b2,b3)?

最佳答案

您在这里混合了两个完全不同的概念,但是由于它是主线程/上下文/队列,因此您的混合被屏蔽了并且“有效”。

受管对象上下文的performBlockAndWait:performBlock:方法不能保证在哪个线程上执行块,只有安全访问已访问/已突变的数据。由于您的上下文属于主队列并发类型,因此存在例外,因为可以安全地仅在主线程上触摸performBlockAndWait:performBlock:方法之外的对象。因此,当您将块排队在主队列上运行时,可以确保它在主线程上运行,因此您的数据是安全的。

主线程上的块执行不是原子的。否则,多线程的意义何在?为了确保数据安全,访问数据时必须调用performBlockAndWait:performBlock:方法。您可以确保主队列调度的块将不受其他主队列调度的块的干扰而运行,并且托管对象上下文队列(后台或主队列)是串行的,因此仅允许一个块并发访问数据。

关于ios - performBlockAndWait与dispatch_sync(dispatch_get_main_queue(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19369929/

10-09 06:31