Web サービス データのコア データへのキャッシュを達成するための良い方法は何ですか。主な目的は、デバイスがオンラインになるか、何らかの更新が行われ、ユーザーがオフラインでもデータを取得できるようになったときに、Web サービス データをコア データに同期することです。そのことは、良い提案があれば実装されます。
2 に答える
私はこれをしました。私のプロセスは、ネットワーク クライアント (私の場合は AFNetworking) を使用することでした。要求が成功したら、次のことを行います。
コア データ エンティティからすべてのオブジェクトを削除します
AppDelegate で NSOperationQueue を作成し、バックグラウンド スレッドで使用される新しい ManagedObjectContext をインスタンス化したカスタム パーサー クラスを使用します。
Web サービスからの応答を解析し、次を使用してバックグラウンド スレッドでオブジェクトを CD エンティティに挿入し直します。
// Register context with the notification center
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self
selector:@selector(mergeChanges:)
name:NSManagedObjectContextDidSaveNotification
object:ctx];
次に、マネージド オブジェクトを保存すると (5 回のパスごとに保存を行いました)、通知が送信され、このメソッドが起動されます。
- (void)mergeChanges:(NSNotification *)notification
{
id appDelegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *mainContext = [appDelegate managedObjectContext];
// Merge changes into the main context on the main thread
[mainContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:)
withObject:notification
waitUntilDone:NO];
}
これにより、主にバックグラウンドで Core Data Entity が更新され、メイン スレッドで (5 つの「レコード」ごとに) 変更がマージされます。ユーザー向けの最初の UI は、更新される Core Data Entity に依存する TableView でした。更新は、新しいデータが入ってくる間、ユーザーが tableview を使用できるほど十分に高速でした (FetchedResultsController は、新しいデータの挿入を管理します)。テレビの列)。
必要に応じてさらにコードを送信できますが、その要点は、作成されたマネージド オブジェクトを NSOperationQueue を使用してバックグラウンド スレッドで解析し、メイン スレッドの MOC を使用してコンテキストへの変更を頻繁に (私の場合は 5 レコード) マージすることでした。 .
RestKit を試す: http://restkit.org/
RestKit の主な目標は、開発者がアプリケーションのデータ モデルに関してより多くのことを考え、リクエストの送信、レスポンスの解析、およびリモート リソースの表現の構築の詳細について心配しなくて済むようにすることです。