0

私のプロジェクトでは、この方法で作成された JSON ファイルをダウンロードする必要があります。

[{"id":"2","n":"One"},{"id":"2","n":"Two"},{"id":"2","n":"Three"},...]

私のコードはこれです:

- (void) startPopulate:(NSArray *)array{

    NSManagedObjectContext *context = [[self sharedAppDelegate] managedObjectContext];

    NSFetchRequest *fetchRequest=[NSFetchRequest fetchRequestWithEntityName:@"Myentity"];
    NSError *error = nil;

    for (id element in array){

        [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"id == %@",[element objectForKey:@"id"]]];
        Myentity *myE = [[context executeFetchRequest:fetchRequest error:&error] lastObject];

        //update
        if (myE != nil){

            myE.id_e = [element objectForKey:@"id"];
            myE.name = [element objectForKey:@"n"];
        }

        //new element
        else{

            Myentity *myE = [NSEntityDescription insertNewObjectForEntityForName:@"Myentity" inManagedObjectContext:context];
            myE.name = [element objectForKey:@"n"];
            myE.id_e = [element objectForKey:@"id"];
        }
    }

    if (![context save:&error]) {
        NSLog(@"couldn't save: %@", [error localizedDescription]);
    }
    else{

        NSLog(@"DB UPDATED");
    }
}

ご覧のとおり、メソッドに辞書の配列を渡し、エンティティが存在するかどうかを確認します。正常に動作し、特に問題はありません。それを呼び出す方法である場合、「問題」は、12000 個の要素があり、このメソッドが約 53 秒間実行されることです。とても遅いです。より迅速に処理するには、どのような種類のソリューションを採用できますか? または、このメソッドをバックグラウンド プロセス内に配置する必要がありますか? ありがとう

4

2 に答える 2

0

コア データの使用中にバックグラウンド スレッドを作成する方法は次のとおりです。

dispatch_queue_t fetchQ = dispatch_queue_create("JSON Fetcher", NULL);
    dispatch_async(fetchQ, ^{
        NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
        context.parentContext = self.mainMOC;

        [context performBlock:^{
            // implement your own background code here

            NSError *error;
            if(![context save:&error]) {
                // handle error
            }
        }];
});

結果が mainMOC に反映されるように、結果を保存する必要もあります。それが役に立てば幸い!

于 2014-04-02T10:53:44.807 に答える
0

バックグラウンドプロセスに入れる必要がありますか?

絶対。バックグラウンド スレッドを開始し、メイン コンテキストから子コンテキストを作成して、すべての作業を行います。

他にできること

管理対象オブジェクト コンテキストに対して行った保存されていないすべての変更は、メモリに保存されます。保存する前に何千もの変更を行うことは、大量のメモリを消費するだけでなく、保存にも時間がかかるため、お勧めできません。

更新を一度に 100 個の変更にバッチ処理し、100 個の各ブロックを保存できます。

代替案

アプリのこれらのアイテムを常にロードしている場合は、それらを DB にプリロードして、アプリ自体にバンドルすることもできます。

そうすれば、既にそこにあるため、実行時にそれらを保存する必要はありません。

于 2014-04-01T08:55:10.373 に答える