【发布时间】:2017-01-10 23:34:19
【问题描述】:
我一直在测试 iOS 10 中的新核心数据堆栈。我的测试应用将 JSON 数据解析为核心数据,我试图在用户可以访问 UI 时实现这一点。
我正在使用默认核心数据堆栈并使用后台上下文。
在 AppDelegate.m 中:
- (NSPersistentContainer *)persistentContainer {
// The persistent container for the application. This implementation creates and returns a container, having loaded the store for the application to it.
@synchronized (self) {
if (_persistentContainer == nil) {
_persistentContainer = [[NSPersistentContainer alloc] initWithName:@"CoreDataTestingMDC"];
[_persistentContainer loadPersistentStoresWithCompletionHandler:^(NSPersistentStoreDescription *storeDescription, NSError *error) {
if (error != nil) {
NSLog(@"Unresolved error %@, %@", error, error.userInfo);
abort();
}
}];
}
}
_persistentContainer.viewContext.automaticallyMergesChangesFromParent = YES;
return _persistentContainer;
}
我有一个简单的主从 UI,它在主视图控制器中显示核心数据实体,在详细视图中显示详细属性。如果用户不滚动主视图,一切正常。如果用户滚动,我通常会在保存时收到此错误:
Unresolved error Error Domain=NSCocoaErrorDomain Code=133020 "(null)" UserInfo={conflictList=(
"NSMergeConflict (0x600000667c00) for NSManagedObject (0x610000096490) with objectID '0xd000000000440000 <x-coredata://CFF27A51-8F9E-4898-A4EA-CD85C0AFF300/ContentItem/p17>'
with oldVersion = 44 and newVersion = 45...
它继续列出具有完全相同属性的冲突项目。
同样在我的 AppDelegate 中,我添加了一个简单的便捷方法来生成背景上下文:
- (NSManagedObjectContext *)createBackgroundContext {
return [self.persistentContainer newBackgroundContext];
}
这被传回 AppDelegate 进行保存操作:
- (void)saveContext:(NSManagedObjectContext *) theContext {
NSError *error = nil;
if ([theContext hasChanges] && ![theContext save:&error]) {
NSLog(@"Unresolved error %@, %@", error, error.userInfo);
abort();
}
}
UI 按预期在 viewContext 上运行。我一直非常小心地使用所有 JSON 解析器编写的背景上下文。不知道为什么会崩溃。
更新:
似乎每当应用程序在初始运行后运行时就会发生错误。我可以在干净的模拟器上或删除应用程序后对其进行测试。它可以很好地将数据解析为核心数据,并且还会在用户与应用程序交互时更新。在第二次构建和运行时,应用程序将因上述错误而崩溃。
【问题讨论】:
标签: ios core-data concurrency