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并且很惊讶它早就引发了异常。
答案 0 :(得分:0)
您可能正在主线程上调用Map()
,然后将entity
分配给私有威胁上下文,然后尝试在主线程中对其进行操作。如果您想使用该私有线程上下文,则需要调用perform
块,以便在私有线程上执行此操作:
context.performAndWait {
super.init(entity: entity!, insertInto: context)
do {
try context.save()
}catch{
print(error)
}
}