【发布时间】:2014-04-23 01:39:41
【问题描述】:
您好,当托管对象在一个子上下文中更改(之后保存)并在其他子上下文中删除(首先保存)时,我的应用程序崩溃了。
如何重现:
1.创建新项目,启用“空应用程序”模板和核心数据。
2.将managedObjectContext getter更改为following(我已经更改了并发类型)
3.请将didfinishLaunching方法替换为following
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // 应用程序启动后自定义的覆盖点。 self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; { //插入 NSManagedObjectContext *insertingContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; [insertingContext setParentContext:self.managedObjectContext]; [insertingContext performBlockAndWait:^{ 测试 *test = (Test *)[NSEntityDescription insertNewObjectForEntityForName:@"Test" inManagedObjectContext:insertingContext]; test.test=@"测试"; [insertingContext 保存:无]; [self.managedObjectContext performBlockAndWait:^{ [self.managedObjectContext 保存:无]; }]; NSLog(@"插入并保存到持久化存储"); }]; } { //获取mo并更改属性 NSManagedObjectContext *acceesingContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; { [acceesingContext setParentContext:self.managedObjectContext]; [访问上下文 performBlockAndWait:^{ NSFetchRequest *request = [[NSFetchRequest alloc] init] ; [请求 setEntity:[NSEntityDescription entityForName:@"Test" inManagedObjectContext:acceesingContext]]; NSArray *results = [acceesingContext executeFetchRequest:request error:nil]; if ([结果计数] > 0 ) { 测试 *test= [结果 objectAtIndex:0]; test.test=@"你好"; NSLog(@"访问并更改了属性以便触发错误"); } }]; } { NSManagedObjectContext *deletingContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; [删除上下文 setParentContext:self.managedObjectContext]; [删除上下文 performBlockAndWait:^{ NSFetchRequest *request = [[NSFetchRequest alloc] init] ; [请求 setEntity:[NSEntityDescription entityForName:@"Test" inManagedObjectContext:deletingContext]]; NSArray *results = [deletingContext executeFetchRequest:request error:nil]; if ([结果计数] > 0 ) { 测试 *test= [结果 objectAtIndex:0]; [deletingContext deleteObject:test]; [删除上下文保存:无]; [self.managedObjectContext performBlockAndWait:^{ [self.managedObjectContext 保存:无]; }]; NSLog(@"已删除并保存到持久化存储"); } }]; } [访问上下文执行块:^{ // 这里崩溃了,请帮忙。 [访问上下文保存:无]; }]; } 返回是; }4.Finally 添加名为 'Test' 的实体和属性 'test' (NSString) 并运行应用程序
我面临的问题是,当一个子 moc 获取了一个托管对象并更改了其中的一个属性,而另一个子 moc 删除并将更改保存到持久存储时。保存修改 moc 的 moc 时发生崩溃。
崩溃报告
【问题讨论】:
-
另外加上@try@catch@finally块也没有避免上面的crash。
-
尝试了所有不同的合并策略,仍然崩溃。
标签: ios objective-c core-data nsmanagedobjectcontext