GCD核心数据

时间:2017-03-30 06:15:58

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

我正在使用核心数据探索GCD。我知道托管对象上下文不是线程安全的。

我使用选项" NSPrivateQueueConcurrencyType"创建了私有上下文。根据文档我必须使用performBlock或performBlockAndWait来执行任何上下文操作,它将在自己的私有线程中执行该操作。我的问题是,

  1. 在执行块内我需要做什么操作?是仅访问上下文对象还是使用托管对象?
  2. 即使我在" DispatchQueue.global()。async"(不使用执行块)中向数据库插入新对象,它也能正常工作。为什么? (这是一个不同的主题)
  3. 如果我们使用" NSPrivateQueueConcurrencyType"?
  4. 创建上下文,那么可以在不同的线程中进行数据库操作吗?

    我可以对每个数据库操作使用执行块,但是我们的项目已经有很多代码在私有队列中运行。请帮助我更好地理解这一点。

1 个答案:

答案 0 :(得分:2)

这个答案是Sandeep Bhandari给出的答案的结论。在这里,我假设每个人都清楚使用线程和队列概念。

始终应该在任何时间从单个线程访问托管对象上下文,因为它不是线程安全的。如果我们在多线程中使用上下文,我们应该确保它是序列化的,这样就没有两个线程同时访问相同的上下文。如果它确实会崩溃。

iOS 5及更高版本,Apple提供了3种创建上下文的方法。

  1. 限制并发类型(在iOS 10中不推荐使用):如果使用此选项创建上下文,则有责任确保在线程中执行所有数据库操作这创造了这个背景。

  2. 私有队列并发类型:如果我们使用此选项创建上下文,它将创建自己的内部队列来创建此上下文并确保所有数据库操作发生在同一个线程中。只有在 performBlock performBlockAndWait 中使用此上下文执行所有任务时,它才会使用内部队列。如果您正在使用任何其他队列来使用此上下文执行任何数据库操作,则如果没有两个线程同时访问,则它将起作用。如果两个线程正在访问它,这将崩溃。管理它非常困难,因为任务执行在运行时发生,具体取决于资源可用性。这种类型的问题不容易重现。因此,使用这些 performBlock API来使用此上下文执行任何数据库操作。

  3. 主队列并发类型:如果使用此选项创建上下文,它将在主线程中创建托管对象上下文。您需要在主线程中使用此上下文执行任何数据库操作。您也可以在此处使用 performBlock 以确保所有任务都在主线程中发生。如果没有两个线程同时访问,即使使用此上下文执行任何操作也可以在其他线程中正常工作。