如何尽快更新所有记录?

时间:2013-05-08 14:26:38

标签: ios core-data

我需要更新具有相同值的所有记录。而且我不希望迭代对象,因为超过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];

那么如何用一个“查询”更新所有记录?或者有没有人更好地了解如何实现这一点(也许更有效率的迭代方式)?

将它放在后台线程中是一个解决方案(也许),但我仍然希望在将它放入后台线程之前先对其进行优化。

谢谢!

1 个答案:

答案 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];