2016-03-28 65 views
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線程中。

回答

0

好吧 - 就在我按下帖子按鈕之前,我意識到我自己的問題的答案))如果有人會遇到類似的問題,將留在這裏。問題是 - 我的父上下文使用MainConcurrencyType實例化。當我的代碼開始提取關係時,它正在經歷這個上下文,因此我假設主隊列。只要我將併發類型改爲私有,錯誤就消失了。