所以我一直在玩这种确切的情况,我不会与第一个答案相矛盾——你可能不应该这样做,如果你必须这样做,也许 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: 是否需要,尽管它可能有助于清除控制器内容中的错误。
I have not been able to get it to restore the tableView selection, though that may be because I do this within a tableview delegate call, so the view's selection gets out of synch with the controller's selection no matter what hacks I try. Maybe this could work for someone, but I suggest trying to figure out how to not allocate a new MOC once your view has bindings to it.