gpt4 book ai didi

ios - NSManagedObjectContext 死锁

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

最近我遇到了一个无法解释的问题。所以我有一个 DocumentContext 类,其中包含一个 Document (NSManagedObject)。这些类的代码是

extension Document {

@NSManaged var title: String?
@NSManaged var type: String?
@NSManaged var created_at: NSDate?
@NSManaged var fields: NSSet?
@NSManaged var imagePairs: NSOrderedSet?

}

class DocumentContext: NSManagedObjectContext {

var document: Document!

convenience init(document: Document? = nil) {
self.init(concurrencyType: .PrivateQueueConcurrencyType)
self.parentContext = document?.managedObjectContext ?? NSManagedObject.defaultContext
self.performBlockAndWait { [unowned self] in
if let doc = document {
let id = doc.objectID
self.document = self.objectWithID(id) as! Document
} else {
self.document = Document.create(self)
}

}
}

override init(concurrencyType ct: NSManagedObjectContextConcurrencyType) {
super.init(concurrencyType: ct)
}

required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

}

现在这是奇怪的部分,我在 viewController 内的主线程上有两个调用:

    context.performBlock { [unowned self] in
let pairs = self.context.document.imagePairs?.array as? [ImagePair]
}

不久之后

    context.performBlock { [unowned self] in
let fields = self.context.document.fields
}

它按预期工作,但是当我将最后一个调用更改为 performBlockAndWait 时,整个应用程序很好地挂起。我按下暂停键,发现显然这个调用 self.context.document.imagePairs? 被信号量阻止了,所以看起来它被主线程或其他东西阻止了。有什么想法为什么它会在主线程上做一些事情吗?从我的角度来看,它显然应该保留在 ManagedObjectContext 线程中。

最佳答案

好吧 - 就在我按下发布按钮的前一秒,我意识到了我自己问题的答案))如果有人遇到类似的问题,我会将其留在这里。问题是 - 我的父上下文是用 MainConcurrencyType 实例化的。当我的代码开始获取关系时,它正在经历这个上下文,因此我认为是主队列。一旦我将并发类型更改为私有(private),该错误就消失了。

关于ios - NSManagedObjectContext 死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36260870/

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