【发布时间】:2016-01-08 00:06:41
【问题描述】:
当我在来自单独的后台队列的 NSManagedObjectContext 的私有队列中调用 save() 时,我的应用程序(单元测试)正在停止。它是一个普通的 Core Data 堆栈(具有用于单元测试的内存中持久存储)。
私有队列上下文的重点不就是您不应该关心操作来自哪个队列吗?我应该如何解决这个问题?
我无法单独重现它,但这是我的设置的粗略想法(伪 Swift,跨多个类的压缩调用):
let store = inMemoryStoreCoordinator()
let mainContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
mainContext.persistentStoreCoordinator = store
let childContext = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
childContext.parentContext = mainContext
let q = NSOperationQueue()
let group = dispatch_group_create()
q.addOperationWithBlock {
dispatch_group_enter(group)
childContext.performBlock {
try! childContext.save()
dispatch_group_leave(group)
}
}
dispatch_group_wait(group, DISPATCH_TIME_FOREVER)
【问题讨论】:
-
添加持久存储协调器会改善情况吗?
-
@pbasdf 不,它没有。我更新了问题,提到我遇到问题的实际代码有一个 PSC。
-
我试了几次,有时我只得到“a”;有时是“a”和“b”。我认为这可能只是一个时间问题——前台处理在异步之前完成。如果在 dispatch_async 之后添加一些处理,您会同时看到“a”和“b”。
-
@pbasdf 很有趣,这就解释了为什么操场会表现出这种行为。添加
XCPlaygroundPage.currentPage.needsIndefiniteExecution = true即可。我需要想出一个更好的测试用例。
标签: multithreading swift core-data nsoperationqueue