NSManagedObjectContext死锁

NSManagedObjectContext死锁

最近,我遇到了一个我无法解释的问题。因此,我有一个DocumentContext类,其中包含一个文档(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实例化。当我的代码开始获取关系时,它正在经历此上下文,因此我认为是主队列。一旦我将并发类型更改为私有,该错误就消失了。

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

10-12 03:45