我需要更新所有具有相同值的记录。而且我不想对对象进行迭代,因为超过 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 的一条语句为每个对象设置 requested=false。通过服务器返回的 id(平均 20 个)并为这些设置 request=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];
那么如何用一个“查询”更新所有记录呢?或者有没有人有更好的想法如何实现这个(也许是更高效的迭代方式)?
把它放在后台线程是一个解决方案(也许),但我还是想先优化它,然后再把它放在后台线程中。
谢谢!