gpt4 book ai didi

multithreading - 从后台队列调用时,核心数据 NSManagedObjectContext 保存永远不会返回

转载 作者:行者123 更新时间:2023-11-30 13:48:07 24 4
gpt4 key购买 nike

当我在来自单独后台队列的 NSManagedObjectContext 私有(private)队列中调用 save() 时,我的应用(单元测试)停止运行。它是一个普通的核心数据堆栈(具有用于单元测试的内存中持久存储)。

私有(private)队列上下文的全部意义难道不是您不应该关心操作来自哪个队列吗?我该如何解决这个问题?

我无法单独重现它,但这是我的设置的一个粗略想法(伪 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)

最佳答案

发生这种情况的原因有多种,但我们无法从提供的代码中推断出任何原因。幸运的是,应该相当容易调试,只需在死锁(最有可能)发生后暂停调试器,看看正在等待什么。这可能是上下文合并僵局,我愿意把钱押在上面。

关于multithreading - 从后台队列调用时,核心数据 NSManagedObjectContext 保存永远不会返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34667433/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com