最近我遇到了一个我无法解释的问题。所以我有一个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线程中。
答案 0 :(得分:0)
好的 - 在按下发布按钮之前的第二个我意识到我自己的问题的答案))如果有人遇到类似的问题,请留在这里。问题是 - 我的父上下文是用MainConcurrencyType实例化的。当我的代码开始获取关系时,它正在经历这个上下文,因此我认为是主队列。一旦我将并发类型更改为私有,错误就消失了。