3

私のアプリケーションでは、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 は で実行successBlockdispatch_get_main_queue()れるため、GUI スレッドで呼び出されます。

この同期モデルは大丈夫ですか? 時々(シミュレーターよりも実際のデバイスでより頻繁に)、NSFetchedResultsController「インデックスにオブジェクトがありません:インデックスのセクションにありません」または「CoreDataは障害を満たせませんでした...」などのエラーが発生するためです。

彼らは皆、Core Data とマルチスレッド環境に何か問題があることを示唆しています。これら 3 つのツールをすべて接続して連携させようとした人はいますか? もしそうなら、私は何が欠けていますか? そのアーキテクチャに適したコード サンプルはありますか?

4

1 に答える 1

2

以下を使用することをお勧めします。

[MagicalRecord saveWithBlock:(void(^)(NSManagedObjectContext *localContext))block];

スレッド化を処理するので、バックグラウンド コンテキストから親コンテキストに何かが保存されることを心配する必要はありません。

このブログ投稿 (MagicalRecord の作成者 Saul Mora によって書かれた) を読むことを強くお勧めします: IMPORTING DATA MADE MADE EASY . これは、MagicalRecord の動作に関する非常に優れた背景情報と、その使用方法の例です。

データ モデルを正しく設定すると、実際には MagicalRecord にすべてのマッピングを実行させることができimportFromObject:、ブロック内で呼び出すsaveWithBlock:だけで済み、マッピングの処理について心配する必要はありません。上記のリンク先の記事では、適切に行う方法について詳しく説明していますが、ある程度の練習が必要です。

于 2013-01-30T02:57:24.607 に答える