【问题标题】:Coredata multithreading violation when using ObjectMapper使用 ObjectMapper 时违反 Coredata 多线程
【发布时间】:2017-07-22 09:36:24
【问题描述】:
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。它符合可映射协议。

public class Shop: NSManagedObject, Mappable

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

【问题讨论】:

    标签: ios core-data objectmapper


    【解决方案1】:

    您可能在主线程上调用Map(),然后将entity 分配给私有威胁上下文,然后尝试在主线程中对其进行处理。如果你想使用那个私有线程上下文,你需要调用一个perform 块,它会在一个私有线程上执行它:

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

    【讨论】:

    • 它帮助我防止了丑陋的崩溃。
    猜你喜欢
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多