NSPrivateQueueConcurrencyType串行还是并发?

时间:2017-06-01 18:37:58

标签: objective-c core-data

正如标题所说,问题是,如果并发类型为NSManagedObjectContext的{​​{1}}是串行或并发的。

更具体地说,如果我打电话

NSPrivateQueueConcurrencyType

使用长时间运行的任务,是否会阻止使用performBlock对该上下文的其他调用,直到第一个完成?

6 个答案:

答案 0 :(得分:3)

我不相信它的记录方式。但是,核心数据通常不是线程安全的,performBlockperformBlockAndWait方法是解决这个问题的方法 - 将所有Core Data工作放在一个队列中。因此,如果它是并发队列,我会非常惊讶,因为重点是避免并发。

答案 1 :(得分:2)

我在官方文档中找不到任何证据,但最近我与NSPrivateQueueConcurrencyType合作,我记得它是连续的。 this blog post也指出:

  

当一个的NSManagedObjectContext与初始化initWithConcurrencyType创建的:NSPrivateQueueConcurrencyType]或 - [initWithConcurrencyType:NSMainQueueConcurrencyType]所有访问的上下文和它的管理对象都必须通过方法 - [performBlock:或 - [performBlockAndWait:]。核心数据使用串行队列来确保上下文中的操作按顺序执行,并且一次只发生一个操作

答案 2 :(得分:2)

它是来自Apple docs的串行队列。

或者您可以简单地尝试运行此代码并查看结果。这些数字将按顺序打印。

    let privateMOC = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
    privateMOC.perform {
        for i in 0...8000 {
            if i.isMultiple(of: 3000) {
                print("1")
            }
        }
    }
    privateMOC.perform {
        for i in 0...8000 {
            if i.isMultiple(of: 3000) {
                print("2")
            }
        }
    }

答案 3 :(得分:0)

NSMainQueueConcurrencyType使用主队列。主队列绑定到主线程,因此串行。

  

主调度队列是一个全局可用的串行队列,它在应用程序的主线程上执行任务。

答案 4 :(得分:0)

这是一个串行队列。如果您指定performBlock,则在调用performBlockAndWaitNSPrivateQueueConcurrencyType时将依次执行代码。

Apple不会在苹果的文档中随机选择PrivateQueue这个词,Private Queue = Serial Queue。在这里查看Serial Queue description

  

串行队列(也称为专用调度队列)按照将它们添加到队列中的顺序一次执行一个任务。

此外,我在调试中再次检查了这一点。请查看以下屏幕截图中的最后一个线程: enter image description here

答案 5 :(得分:0)

我已经测试过所有任务都会依次执行,但是可能在不同的线程中执行

 backgroundContext.perform {
    print("perform------:\(self.number)", Thread.current)
    self.number += 1
 }

enter image description here