当我打开并发调试开关“com.apple.CoreData.ConcurrencyDebug 1”来跟踪 CoreData 的所有并发问题时,在调用 insertingNewObjectForEntityForName 时不断发生崩溃。
Xcode 显示的消息是 EXC_BAD_INSTRUCTION(代码 = EXC_I386_INVOP,子代码 = 0x0)。这是我的代码
这是我的 ManagedObjectContext 实现
- (NSManagedObjectContext *)managedObjectContext
{
if (_managedObjectContext != nil) {
return _managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return _managedObjectContext;
}
这是 [self privateContext] 的实现
-(NSManagedObjectContext *)privateContext
{
NSManagedObjectContext *pvtContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
pvtContext.parentContext = [CoreDataMgr sharedInstance].managedObjectContext;
return pvtContext;
}
场景 1:在主线程上执行 - 不会崩溃
NSManagedObjectContext *mainContext = [CoreDataMgr sharedInstance].managedObjectContext;
CDPayments* cdPayment = [NSEntityDescription insertNewObjectForEntityForName:PAYMENTS_TABLE inManagedObjectContext:mainContext];
场景 2:在后台线程上执行 - 崩溃!
NSManagedObjectContext *pvtContext = [self privateContext];
CDPayments* cdPayment = [NSEntityDescription insertNewObjectForEntityForName:PAYMENTS_TABLE pvtContext];
我真的不清楚为什么在具有私有上下文的后台线程上执行此操作会崩溃......
我正在针对 iOS9 SDK 使用 Xcode 8,并且在保存支付对象时调用上述代码。