2

サーバーからユーザー uid のリストを取得した後、かなりの量のユーザー オブジェクトを同じ値で更新する必要があります。サーバーは、次のようなユーザー ID の配列を返します。

{
    "ids": [1, 2, 3, 4]
}

ここには 100 以上の ID が存在する可能性があるため (ローカル ユーザー テーブルには 2k 以上のレコードが保持されます)、できるだけ効率的な方法を探しています。最初に、すでに isOpened の値を 0 にする必要があります。SQL 用語では、次のようにする必要があります。

UPDATE users SET isClosed = 0 WHERE isClosed = 1

UPDATE users SET isClosed = 1 WHERE userId IN (1, 2, 3, 4)

基本的に、ユーザーがアプリを長期間使用していないときに問題を解決して、 isClosed 属性を一括更新します。

さて、問題のサーバーのフェッチと「マッピング」の部分です。オブジェクトへの応答をマッピングせずに適切なレストキット リクエストを行う方法を理解できませんでした...これを行うためのより適切な方法があるかどうかアドバイスしてください...基本的なレストキット/afnetworking get リクエストを実行しています:

[[[RKObjectManager sharedManager] HTTPClient] getPath:[NSString stringWithFormat:@"/api/%@/closeUsers", [[MyCredentialStore sharedInstance] userId]]
parameters:nil
success:^(AFHTTPRequestOperation *operation, id responseObject) {

NSArray *userIDs = [responseObject objectForKey:@"ids"];
    NSLog(@"%@", userIDs);
    // 1. set the default value for isClosed (0) for all users
    // 2. update the users with userIDs to isClosed = 1
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    // response code is in operation.response.statusCode
}];

成功ブロックで 1. と 2. を実行するにはどうすればよいですか? または、このようなバッチ更新を行う適切なレストキットの方法はありますか?

4

1 に答える 1

3

指定したデータ量では、単純なループだけで非常に効率的です。

NSArray *closedUsers = [allUsers filteredArrayUsingPredicate:
        [NSPredicate predicateWithFormat:@"isClosed = %@", @1]];
NSArray *usersFromServer = [allUsers filteredArrayUsingPredicate:
        [NSPredicate predicateWithFormat:@"userID IN %@", userIDs];

for (User *user in closedUsers) {
   user.isClosed = @0; 
}
for (User *user in usersFromServer) {
   user.isClosed = @1;
}

これをテストできます - プレーンな Core Data を使用すると、数秒かかるはずです。

于 2013-07-30T08:17:43.807 に答える