Ard*_*Dev 2 core-data iphonecoredatarecipes ios
当我打开并发调试开关 '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;
}
Run Code Online (Sandbox Code Playgroud)
这是 [self privateContext] 的实现
-(NSManagedObjectContext *)privateContext
{
    NSManagedObjectContext *pvtContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
pvtContext.parentContext = [CoreDataMgr sharedInstance].managedObjectContext;
return pvtContext;
}
Run Code Online (Sandbox Code Playgroud)
场景 1:在主线程上执行 - 不会崩溃
NSManagedObjectContext *mainContext = [CoreDataMgr sharedInstance].managedObjectContext;
CDPayments* cdPayment = [NSEntityDescription insertNewObjectForEntityForName:PAYMENTS_TABLE inManagedObjectContext:mainContext];
Run Code Online (Sandbox Code Playgroud)
场景 2:在后台线程上执行 - 崩溃!!
NSManagedObjectContext *pvtContext = [self privateContext];
CDPayments* cdPayment = [NSEntityDescription insertNewObjectForEntityForName:PAYMENTS_TABLE pvtContext];
Run Code Online (Sandbox Code Playgroud)
我真的不清楚为什么在具有私有上下文的后台线程上执行此操作会崩溃......
我对 iOS9 SDK 使用 Xcode 8,并且在保存付款对象时调用上述代码。
这是因为你做错了核心数据并发。当您使用NSPrivateQueueConcurrencyTypeor 时NSMainQueueConcurrencyType,您必须将 Core Data 代码包装在对perform()or 的调用中performAndWait()。如果不这样做,则您的代码违反了并发规则,并且完全可以预期此崩溃。
唯一的例外是,如果您使用NSMainQueueConcurrencyType并且确定代码正在主队列上运行,则可以直接进行 Core Data 调用,而无需将它们包装在块中。