我需要更新具有相同值的所有记录。而且我不希望迭代对象,因为超过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)并为那些设置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];
那么如何用一个“查询”更新所有记录?或者有没有人更好地了解如何实现这一点(也许更有效率的迭代方式)?
将它放在后台线程中是一个解决方案(也许),但我仍然希望在将它放入后台线程之前先对其进行优化。
谢谢!
答案 0 :(得分:2)
您仍然需要获取所有对象,但您可以在一行中完成所有操作。
[[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];