1

すべてのレコードを同じ値で更新する必要があります。また、2000 を超えるオブジェクトの場合は約 2 秒かかるため、オブジェクトの反復処理は行いたくありません。基本的に、すべてのユーザーをローカルに配置し、サーバーからユーザー ID を受け取ります。ユーザーがサーバーから戻った場合を除いて、プロパティ 'requested' を false に設定したいと思います。

現在のやり方 (これは完全に間違っています!):

すべてのユーザー (約 2000 人) を繰り返し処理し、要求された値を修正します。

NSFetchRequest * allUsers = [[NSFetchRequest alloc] init];
[allUsers setEntity:[NSEntityDescription entityForName:@"User" inManagedObjectContext:context]];
NSArray *users = [context executeFetchRequest:allUsers error:&error];

NSArray *userIDs = [JSON objectForKey:@"users_ids"];
for (User *user in users) {
    if ([userIDs containsObject:user.userID]) {
        user.requested = [NSNumber numberWithBool:YES];
    } else {
        user.requested = [NSNumber numberWithBool:NO];
    }
    user.requested = [NSNumber numberWithBool:NO];
}
[context save:nil];

それを行う方法の私の考え:

SQL に似た 1 つのステートメントを持つすべてのオブジェクトに対して、requested=false を設定します。サーバーから返された ID (平均で 20) を調べ、それらに対して requested=true を設定します。

// UPDATE users SET requested = false WHERE 1=1

NSArray *userIDs = [JSON objectForKey:@"users_ids"];
for (int i = 0; i < [userIDs count]; i++) {
    User *user = [User userWithServerID:[userIDs[i] integerValue] usingManagedObjectContext:context];
    user.requested = [NSNumber numberWithBool:YES];
}
[context save:nil];

では、1 つの「クエリ」ですべてのレコードを更新するにはどうすればよいでしょうか。または、これを実装する方法についてより良いアイデアを持っている人はいますか (おそらく、反復を実行するよりパフォーマンス効率の高い方法)?

これをバックグラウンド スレッドに入れることは (おそらく) 解決策ですが、バックグラウンド スレッドに入れる前にまず最適化したいと思います。

ありがとうございました!

4

1 に答える 1

2

すべてのオブジェクトをフェッチする必要がありますが、すべてを 1 行で実行できます。

[[fetchedResultsController fetchedObjects] makeObjectsPerformSelector:@selector(setYourValue:) withObject:[NSNumber numberWithBool:YES]];

または、単に配列を循環させます

NSArray *objects = [context executeFetchRequest:allRequest error:&error];
[objects setValue:[NSNumber numberWithBool:YES] forKey:@"user_ids"];
//now save your changes back.
[context save:&error];
于 2013-05-08T14:47:58.043 に答える