したがって、私はこの正確な状況をいじっていますが、最初の答えと矛盾するつもりはありません.おそらくこれを行うべきではありません. このコードは使用しないでください。 私が修正しなかったすべての問題を他の人が発見し、次に進むことができるようにするために、私はそれを提供します。
そうは言っても、元の質問がしようとしていたことを行うことができます-コントローラーを強制的にディスクからリロードします:
// 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を割り当てない方法を見つけようとすることをお勧めします。