使用ObjectMapper时Coredata多线程违规

时间:2017-07-22 09:36:24

标签: ios core-data objectmapper

required public init?(map: Map) {

            let context = (UIApplication.shared.delegate as! AppDelegate).privateContext
            let entity = NSEntityDescription.entity(forEntityName: "Shop", in: context)
            super.init(entity: entity!, insertInto: context)
            self.mapping(map: map)


    }

所以基本上它在第三行引发了一个例外

super.init(entity: entity!, insertInto: context)

CoreData`+[NSManagedObjectContext __Multithreading_Violation_AllThatIsLeftToUsIsHonor__]:
    0x1028df220 <+0>: pushq  %rbp
    0x1028df221 <+1>: movq   %rsp, %rbp
->  0x1028df224 <+4>: ud2    
    0x1028df226 <+6>: nopw   %cs:(%rax,%rax)

我认为如果我使用privateContext它可能会解决问题,但事实并非如此。

lazy var privateContext: NSManagedObjectContext = {
        let privateMOC = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
        privateMOC.parent =  self.managedObjectContext
        return privateMOC
    }()

我无法在initMethod

中执行context.performBlock之类的操作

顺便说一句,我使用的是tristanhimmelman / AlamofireObjectMapper,这是Shop类的managedobject。它符合Mappable协议。

public class Shop: NSManagedObject, Mappable

我认为一切正常,因为我可以看到SQLiteViewer中的对象,但是随机崩溃开始发生,所以我添加了这个-com.apple.CoreData.ConcurrencyDebug 1并且很惊讶它早就引发了异常。

1 个答案:

答案 0 :(得分:0)

您可能正在主线程上调用Map(),然后将entity分配给私有威胁上下文,然后尝试在主线程中对其进行操作。如果您想使用该私有线程上下文,则需要调用perform块,以便在私有线程上执行此操作:

context.performAndWait {
  super.init(entity: entity!, insertInto: context)
  do {
    try context.save()
  }catch{
    print(error)
  }
}