【发布时间】:2011-07-03 19:28:40
【问题描述】:
我的应用正在使用与 Core Data 存储绑定的 NSFetchedResultsController,到目前为止它运行良好,但我现在正尝试使更新代码异步,但我遇到了问题。我创建了一个 NSOperation 子类来进行更新,并成功地将这个新对象添加到 NSOperationQueue。更新代码正在按我的预期执行,我已经通过调试日志和运行后检查 SQLite 存储验证了这一点。
问题是我的后台操作完成后,新的(或更新的)项目没有出现在我的 UITableView 中。根据我有限的理解,我认为我需要通知主 managedObjectContext 发生了更改,以便它们可以被合并。我的通知正在触发,但表格视图中没有出现新项目。如果我停止应用程序并重新启动它,对象会出现在 tableview 中,让我相信它们已成功插入到核心数据存储中,但没有合并到主线程上使用的 managedObjectContext 中。
我已经包含了我的操作的 init、main 和 notification 方法的示例。我是否错过了一些重要的事情,或者可能以错误的方式解决这个问题?任何帮助将不胜感激。
- (id)initWithDelegate:(AppDelegate *)theDelegate
{
if (!(self = [super init])) return nil;
delegate = theDelegate;
return self;
}
- (void)main
{
[self setUpdateContext:[self managedObjectContext]];
NSManagedObjectContext *mainMOC = [self newContextToMainStore];
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self
selector:@selector(contextDidSave:)
name:NSManagedObjectContextDidSaveNotification
object:updateContext];
[self setMainContext:mainMOC];
// Create/update objects with mainContext.
NSError *error = nil;
if (![[self mainContext] save:&error]) {
DLog(@"Error saving event to CoreData store");
}
DLog(@"Core Data context saved");
}
- (void)contextDidSave:(NSNotification*)notification
{
DLog(@"Notification fired.");
SEL selector = @selector(mergeChangesFromContextDidSaveNotification:);
[[delegate managedObjectContext] performSelectorOnMainThread:selector
withObject:notification
waitUntilDone:YES];
}
在调试时,我检查了contextDidSave: 中发送的notification 对象,它似乎包含所有添加的项目(摘录如下)。这继续让我认为插入/更新正确发生,但不知何故合并没有被触发。
NSConcreteNotification 0x6b7b0b0 {name = NSManagingContextDidSaveChangesNotification; object = <NSManagedObjectContext: 0x5e8ab30>; userInfo = {
inserted = "{(\n <GCTeam: 0x6b77290> (entity: GCTeam; id: 0xdc5ea10 <x-coredata://F4091BAE-4B47-4F3A-A008-B6A35D7AB196/GCTeam/p1> ; data: {\n changed =
【问题讨论】:
标签: objective-c ios cocoa-touch core-data