私のアプリケーションでは、MagicalRecord + AFNetworking + NSFetchedResultsController を一緒に使用して、データを同期し、マップまたは tableView に動的に表示しようとしています。
ダウンロード方法のコードを見てみましょう。
+ (void) getDataWithCompletionBlock: (void (^)(void)) block {
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:URL_GET_DATA]];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
for (NSDictionary *dict in JSON) {
[MyModel createOrUpdateMyModelFromDict:[dict mutableCopy]];
}
[[NSManagedObjectContext MR_contextForCurrentThread] MR_saveInBackgroundCompletion:^{
[[NSManagedObjectContext MR_contextForCurrentThread] MR_saveNestedContexts];
block();
}];
});
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
DDLogError(@"getDataWithCompletionBlock FAILURE: %@", error);
}];
[operation start];
}
を使用してデータをダウンロードしAFJSONRequestOperation
、GCD とバックグラウンド スレッドを使用してモデルを作成し、現在のスレッドのコンテキストを保存して実行しますsuccessBlock
(MagicalRecord は で実行successBlock
さdispatch_get_main_queue()
れるため、GUI スレッドで呼び出されます。
この同期モデルは大丈夫ですか? 時々(シミュレーターよりも実際のデバイスでより頻繁に)、NSFetchedResultsController
「インデックスにオブジェクトがありません:インデックスのセクションにありません」または「CoreDataは障害を満たせませんでした...」などのエラーが発生するためです。
彼らは皆、Core Data とマルチスレッド環境に何か問題があることを示唆しています。これら 3 つのツールをすべて接続して連携させようとした人はいますか? もしそうなら、私は何が欠けていますか? そのアーキテクチャに適したコード サンプルはありますか?