4

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 からオブジェクトをフェッチしますが、まだ古いバージョンです。

4

2 に答える 2

4

これは iOS のバグである可能性があります。このスレッドを参照してください: http://devforums.apple.com/message/735512#735512

これは私のためにそれを修正しました:

NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
moc.stalenessInterval = 0;

これは役に立ちませんでした:

[moc refreshObject:myObject mergeChanges:YES];
于 2012-11-20T06:29:59.903 に答える
1

の欠如はNSPersistentStoreDidImportUbiquitousContentChangesNotification、SharedCoreData サンプル コードからのかなりの省略です。あなたは間違いなくそれを観察する必要があり、そうしていないという事実は、更新された値が表示されないことに直接関係しています. アプリを終了して再起動すると、期待する新しい値が得られる可能性があります。

最も単純なケースでは、この通知を受け取ったときに次の 2 つのことを行う必要があります。

  1. 着信-[NSManagedObjectContext mergeChangesFromContextDidSaveNotification:notification]変更通知を引数として呼び出します。これにより、MOC に新しい値が通知されます。保存されていない変更がメモリにある場合、それらは MOC のマージ ポリシーに従って受信した変更とマージされます (NSMergePolicyオプションの詳細については、ドキュメントに記載されている定数を参照してください)。
  2. 重複除外プロセスを実行します。サンプル コードには、これのサンプル実装があります。それを調べて、データ モデルに適しているかどうか、つまり、実際に重複を正しく検出するかどうかを確認する必要があります。
于 2012-10-26T21:22:27.037 に答える