NSManagedObjectContext和NSArrayController重置/刷新问题

时间:2010-01-13 03:29:00

标签: objective-c cocoa core-data cocoa-bindings nsarraycontroller

我无法让我的用户界面将外部更改(由其他进程制作)反映到sqlite数据存储中。

我有一个相当标准的基于核心数据的NSArrayController / table视图。我的应用程序收到通知,表示已对数据进行了外部更改,此时我执行了

[managedObjectContext reset]; // brute force, but data set is small

问题是,这样做会清除表中的所有数据。数组控制器的arrangeObjects也是空的。我想了一个随后的

[arrayController fetch:nil];

可能有所帮助,但事实并非如此。在managedObjectContext上执行获取请求会显示数据存在并更新,因此managedObjectContext知道更改。

有关如何从重置中“恢复”的任何线索?或者重置方法可能完全错误,在这种情况下是否有更好的方法来加载外部变化?

2 个答案:

答案 0 :(得分:1)

我认为两个进程不应该在同一个Core Data数据库中工作。最好让一个进程充当拥有(并打开)数据库的服务器,让另一个进程发送命令进行更改。我不认为Core Data曾经支持多个进程与同一个数据库进行通信。

答案 1 :(得分:0)

所以我一直在玩这个确切的情况,我不会反驳第一个答案 - 你可能不应该这样做,如果你不得不这样做,也许iCloud可行。 不要使用此代码。我提供它以帮助其他人达到他们可以发现我没有修复的所有问题的程度,然后继续。

也就是说,您可以执行原始问题的操作 - 强制控制器从磁盘重新加载:

// Tear down bindings and context, create new context & rebind
[self.watcherAC unbind:@"managedObjectContext"];
[self saveAction:self]; // Optional, dependent on NSMergePolicy, etc
self.managedObjectContext = [[NSManagedObjectContext alloc] init];
self.managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy;
[self.managedObjectContext setPersistentStoreCoordinator:self.persistentStoreCoordinator];
[self.watcherAC bind:@"managedObjectContext" toObject:self withKeyPath:@"managedObjectContext" options:nil];

// Force controller to refetch and rearrange
NSError* error;
[self.watcherAC fetchWithRequest:nil merge:NO error:&error];  // Immediate fetch
[self.watcherAC prepareContent];
[self.watcherAC rearrangeObjects];

从磁盘上的商店刷新tableView的内容。 (tableView绑定到watcherAC阵列控制器)

我发现 fetch:不是立即 - 它是下次通过应用程序的运行循环完成的。所以要按正确的顺序完成提取/重新排列,你需要使用fetchWithRequest:

我不确定prepareContent:是否需要,虽然它可能有助于清除控制器内容中的错误。

我无法恢复tableView选择,尽管这可能是因为我在tableview委托调用中执行此操作,因此无论我尝试什么黑客,视图的选择都与控制器的选择不同步。 也许这可能对某些人有用,但我建议一旦你的视图绑定它就试图弄清楚如何不分配新的MOC。