从服务器获取用户uid列表后,我需要使用相同的值更新相当大量的Users对象。服务器返回一个用户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属性。
现在,给服务器提取和“映射”部分问题。我无法确定如何在不将响应映射到对象的情况下执行正确的restkit请求...请告知是否有更合适的方法来执行此操作...所以我正在执行基本的restkit / 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.或者是否有适当的restkit方式来进行批量更新?
答案 0 :(得分: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;
}
你可以测试一下 - 使用普通的核心数据应该只需要一瞬间。