【发布时间】:2013-06-21 00:43:38
【问题描述】:
从字面上看,这种并发类型需要一个特定的线程,但使用串行队列会更容易,但是在串行调度队列上使用具有 NSConfinementConcurrencyType 并发类型的上下文是否安全?
【问题讨论】:
从字面上看,这种并发类型需要一个特定的线程,但使用串行队列会更容易,但是在串行调度队列上使用具有 NSConfinementConcurrencyType 并发类型的上下文是否安全?
【问题讨论】:
只要您确定只在上下文中使用该队列,是的,这完全没问题。
Core Data 并不关心线程,而是关心并发访问。如果你序列化访问,你是安全的,但是你选择这样做。您可以使用NSRecursiveLock 或信号量或任何适合您的方式。
请注意,较新的并发模型是基于队列的。 NSPrivateQueueConcurrencyType不保证操作总是在同一个线程上执行,即使你使用performBlock:。它们发生在私有 queue 上,并且可能在不同时间在不同线程上运行。如果您可以很好地管理您的队列和访问权限以自己完成此操作,那么这样做是合理的。
【讨论】:
不,拥有串行队列并不能保证操作将在同一个线程上执行:
Concurrency Programming Guide 指定
串行队列(也称为私有调度队列)执行一项任务 一次按它们添加到队列中的顺序。这 当前正在执行的任务在不同的线程上运行(可能会有所不同 从任务到任务)由调度队列管理。串行 队列通常用于同步对特定资源的访问。
为什么不直接使用 NSPrivateQueueConcurrencyType?它将使您的代码更清晰和线程安全。从初始化上下文的块以外的地方访问上下文时,您只需要调用-performBlock: 或-performBlockAndWait:。
【讨论】: