0
最近我遇到了一個我無法解釋的問題。所以我有一個DocumentContext類,它包含一個Document(NSManagedObject)。這些類是NSManagedObjectContext死鎖
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線程中。