performBlockAndWait vs dispatch_sync(dispatch_get_main_queue()

时间:2013-10-14 21:55:03

标签: ios core-data grand-central-dispatch

Utility.managedObjectContext().performBlockAndWait({

})

dispatch_sync(dispatch_get_main_queue(), {

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

1 个答案:

答案 0 :(得分:0)

你在这里混合了两个完全不同的概念,但由于它是主线程/上下文/队列,你的混合被屏蔽了,并且#34;工作"。

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

主线程上的块执行不是原子的。否则,多线程的重点是什么?为确保数据安全,访问数据时必须调用performBlockAndWait:performBlock:方法。您可以保证主队列调度块不会被其他主队列调度块不间断地运行,并且托管对象上下文队列(后台或主)是串行的,因此只允许一个块同时访问数据。