【发布时间】:2013-07-04 16:20:03
【问题描述】:
我想我理解错误信息:CoreData 无法完成错误,但我不确定应该如何处理。
我们有一个应用程序,我们在其中使用 Core Data 来持久化从 JSON 服务返回的数据。今天我正在做以下事情。
- 从持久存储中获取本地对象并返回 UI
- 询问服务器对象是否已更新 - 当我得到答案时,我会更新 Core Data 托管对象
- 使用更新后的对象更新 UI
问题是;即使我不使用多线程,当 HTTP 请求删除我的 UI 保留的托管对象时,有时也会出现错误。我试图用returnObjectsAsFaults 来获取对象为NO。我想我可以访问托管对象的所有关系和属性,即使它被删除(只要我的 UI 保留了它)。
我应该如何解决这个问题?
我认为我可以使用单独的 NSManagedObjectContext 进行读写。我做了这个测试:
MyAuthorMO *authorUpdate = [[MyAuthorMO alloc] init]; // I have made this init insert the object into the updateContext
authorUpdate.firstname = @"Hans";
authorUpdate.lastname = @"Wittenberg";
authorUpdate.email = @"Hans@somedomain.no";
NSManagedObjectContext *updateContext = [[MyCoreManager getInstance] managedObjectContext];
NSError *error = nil;
[updateContext save:&error];
NSManagedObjectContext *readContext = [[MyCoreManager getInstance] readOnlyContext];
NSFetchRequest *fetchRequest = [managedObjectModel fetchRequestFromTemplateWithName:@"authorByEmail" substitutionVariables:[NSDictionary dictionaryWithObject:@"Hans@somedomain.no" forKey:@"EMAIL"]];
[fetchRequest setReturnsObjectsAsFaults:NO];
NSArray *authors = [readContext executeFetchRequest:fetchRequest error:&error];
MyAuthorMO * readAuthor = [authors objectAtIndex:0];
// Delete the author with update context:
[updateContext deleteObject:authorUpdate];
[updateContext save:&error];
NSLog(@"Author: %@ %@, (%@)", readAuthor.firstname, readAuthor.lastname, readAuthor.email);
只要我使用 readContext 进行获取,日志就会很好地输出。如果我使用 updateContext 进行提取,则会出现异常。这看起来很有希望,但我担心我会在后期遇到问题。迟早我可能会尝试访问未完全获取的属性(错误)。我怎样才能实现我正在寻找的行为?
【问题讨论】:
-
尼克,你可能是对的。我已经阅读了我之前的帖子并接受了最好的解决方案。感谢您的评论。