在后台线程上获取 - 我是否必须创建新的上下文?

时间:2017-01-23 06:23:23

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

我使用-com.apple.CoreData.ConcurrencyDebug 1确保每当我执行Core Data并发错误时崩溃。

我只是想将数据加载到后台,所以这是第一次尝试:

DispatchQueue.global(qos: .background).async {
  let context = NSManagedObjectContext.getMainContext() // made up method
  context.fetch(/* ... */)
}

果然,这会崩溃。也有意义,我们尝试从后台线程访问主要上下文。

第二次尝试:

DispatchQueue.global(qos: .background).async {
  let context = NSManagedObjectContext.createPrivateContextAndAssignParent() // made up method
  context.performAndWait {
    context.fetch(/* ... */)
  }
}

这很好用!我相信,这也是应该如何做的。所以没有真正的问题,但是......

在这种情况下也适用:

DispatchQueue.global(qos: .background).async {
  NSManagedObjectContext.getMainContext()
  context.performAndWait {
    context.fetch(/* ... */)
  }
}

我只是获取主线程的上下文,然后使用prformAndWait访问它,它可以工作!它本应该崩溃! 为什么不崩溃?

谢谢!

编辑1:

整个背景:

DispatchQueue.global(qos: .background).async {
  let stuff = findStuff()
}

func findStuff() -> NSArray? {
  var stuff: NSArray?
  let context = NSManagedObjectContext.getMainContext()
  context.performAndWait {
    stuff = context.fetch(/* ... */)
  }

  return stuff
}

0 个答案:

没有答案