正如标题所说,问题是,如果并发类型为NSManagedObjectContext
的{{1}}是串行或并发的。
更具体地说,如果我打电话
NSPrivateQueueConcurrencyType
使用长时间运行的任务,是否会阻止使用performBlock对该上下文的其他调用,直到第一个完成?
答案 0 :(得分:3)
我不相信它的记录方式。但是,核心数据通常不是线程安全的,performBlock
和performBlockAndWait
方法是解决这个问题的方法 - 将所有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
,则在调用performBlockAndWait
和NSPrivateQueueConcurrencyType
时将依次执行代码。
Apple不会在苹果的文档中随机选择PrivateQueue
这个词,Private Queue
= Serial Queue
。在这里查看Serial Queue description
串行队列(也称为专用调度队列)按照将它们添加到队列中的顺序一次执行一个任务。
答案 5 :(得分:0)