2013-05-08 70 views
1

我需要用相同的值更新所有記錄。而且我不想通過遍歷對象來完成它,因爲對於超過2000個對象需要大約2秒。基本上我有本地所有用戶,我從服務器接收用戶標識。我現在想設置「要求」,除了爲用戶假酒店需要從服務器 -如何儘快更新所有記錄?

它是如何做現在返回(這是完全錯誤的!):

迭代通的所有用戶(其中​​約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]; 

我知道如何做到這一點:請求= false爲一個類似SQL的一個聲明中的每個對象

集。通過服務器返回的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]; 

那麼我怎樣才能用一個「查詢」更新所有的記錄?或者有沒有人有更好的想法如何實現這個(更有效的方式來做迭代也許)?

把它放在後臺線程中是一個解決方案(也許),但我仍然想在將它放入後臺線程之前先優化它。

謝謝!

回答

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