2013-07-30 6 views
2

После получения списка пользовательских uid с сервера мне нужно обновить довольно большое количество объектов Users с тем же значением. Сервер возвращает массив пользовательских идентификаторов, как это:Эффективное обновление большого количества записей данных ядра

{ 
    "ids": [1, 2, 3, 4] 
} 

Там может быть более 100 идентификаторов здесь (локальная таблица пользователей имеет 2k + записи), так что я ищу, как эффективный подход, как это возможно. Сначала мне нужно поставить уже isOpened значения 0. В терминах SQL мне нужно сделать что-то вроде этого:

UPDATE users SET isClosed = 0 WHERE isClosed = 1 

UPDATE users SET isClosed = 1 WHERE userId IN (1, 2, 3, 4) 

В основном я, решая проблему, когда пользователь не использовал приложение в течение длительного периода времени , для массового обновления атрибута isClosed.

Теперь, чтобы получить выборку и «отобразить» часть проблемы. Я не мог понять, как сделать правильный запрос на резервное копирование, не отображая ответ на объекты ... Пожалуйста, сообщите, если есть более правильный способ сделать это ... поэтому я делаю базовый запрос на резервное/afnetworking получить:

[[[RKObjectManager sharedManager] HTTPClient] getPath:[NSString stringWithFormat:@"/api/%@/closeUsers", [[MyCredentialStore sharedInstance] userId]] 
parameters:nil 
success:^(AFHTTPRequestOperation *operation, id responseObject) { 

NSArray *userIDs = [responseObject objectForKey:@"ids"]; 
    NSLog(@"%@", userIDs); 
    // 1. set the default value for isClosed (0) for all users 
    // 2. update the users with userIDs to isClosed = 1 
} 
failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    // response code is in operation.response.statusCode 
}]; 

Теперь как я могу сделать 1. и 2. в блоке успеха? Или есть ли подходящий способ резервного копирования для пакетных обновлений?

ответ

3

С указанием количества данных, которые вы указываете, простой цикл очень эффективен.

NSArray *closedUsers = [allUsers filteredArrayUsingPredicate: 
     [NSPredicate predicateWithFormat:@"isClosed = %@", @1]]; 
NSArray *usersFromServer = [allUsers filteredArrayUsingPredicate: 
     [NSPredicate predicateWithFormat:@"userID IN %@", userIDs]; 

for (User *user in closedUsers) { 
    user.isClosed = @0; 
} 
for (User *user in usersFromServer) { 
    user.isClosed = @1; 
} 

Вы можете протестировать это - при использовании простых данных ядра данные должны занимать секунды.

+0

Работает как очарование. И это довольно быстро. Не знаю, почему меня беспокоила производительность. – digitaljerry

Смежные вопросы