1

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

那么如何用一个“查询”更新所有记录呢?或者有没有人有更好的想法如何实现这个(也许是更高效的迭代方式)?

把它放在后台线程是一个解决方案(也许),但我还是想先优化它,然后再把它放在后台线程中。

谢谢!

4

1 回答 1

2

You would still have to fetch all the objects but you can do it all in one line.

[[fetchedResultsController fetchedObjects] makeObjectsPerformSelector:@selector(setYourValue:) withObject:[NSNumber numberWithBool:YES]];

Or just cycle the array

NSArray *objects = [context executeFetchRequest:allRequest error:&error];
[objects setValue:[NSNumber numberWithBool:YES] forKey:@"user_ids"];
//now save your changes back.
[context save:&error];
于 2013-05-08T14:47:58.043 回答