iCloud と CoreData の WWDC 2012 サンプル コード ( github サンプル コードへのリンク) を採用しようとしていますが、そこで何が起こっているのかを理解するための助けが必要です。
例のように、NSFetchedResultsController からコンテンツを取得するテーブル ビューがあります。NSFetchedResultsController は、例で提供されている CoreDataController からのメインの NSManagedObjectContext に接続されています。エントリへの変更は、あるデバイスから別のデバイスに同期され、魅力的に機能します。しかし、iCloud からの変更が実際にメイン コンテキストにマージされる場所はありません。NSPersistentStoreDidImportUbiquitousContentChangesNotification を使用して変更をマージする多くの例を見てきましたが、このコードでは決して起こりません。
しかし、ここで奇妙なことがあります。メイン コンテキストからオブジェクトを取得し、それを保持します。NSPersistentStoreDidImportUbiquitousContentChangesNotification を受け取った場合、objectId を使用して NSMangedObjectContext からオブジェクトをリロードします。
NSManagedObjectID* objectId = [myObject objectID];
NSManagedObject* theNewObject = [[_coreDataController mainThreadContext] objectWithID:objectId];
myObject = theNewObject;
しかし、オブジェクトは最新ではありません。オブジェクトの一意のプロパティを使用して述語でフェッチしても。しかし、NSFetchedResultsController を含むテーブル ビューには変更が表示されます。ここで何が欠けていますか?
編集1(トムの答えを読んだ後):
のオブザーバーを追加しましたNSPersistentStoreDidImportUbiquitousContentChangesNotification
:
- (void)iCloudupdate:(NSNotification*)note {
NSManagedObjectContext* moc = [[CoreDataController sharedController] mainThreadContext];
[moc performBlock:^{
[moc mergeChangesFromContextDidSaveNotification:note];
[self refreshObject];
}];
}
このメソッドrefreshObject
は を使用しNSManagedObjectID
てメイン MOC からオブジェクトをフェッチしますが、まだ古いバージョンです。