2013-07-30 2 views
2

서버에서 사용자 uid 목록을 가져온 후 상당히 많은 양의 Users 객체를 동일한 값으로 업데이트해야합니다. 서버는 다음과 같이 사용자 ID의 배열을 반환합니다대용량의 핵심 데이터 레코드를 효율적으로 업데이트합니다.

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

여기에 100 개 이상의 아이디의가있을 수 있습니다 (로컬 사용자 테이블은 2K + 기록을 보유), 그래서 나는 가능한 한 효율적인 방법을 찾고 있어요. 기본적으로

UPDATE users SET isClosed = 0 WHERE isClosed = 1 

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

나는 사용자가 오랜 시간 동안 응용 프로그램을 사용하지 않을 때 문제를 해결하고 첫째 나는 이런 식으로 뭔가를 할 필요가 SQL 측면에서 0으로 이미 isOpened 값을 둘 필요 , isClosed 속성을 대량 갱신 할 수 있습니다.

이제 서버가 문제의 일부를 가져와 "매핑"합니다. 객체에 대한 응답을 매핑하지 않고 올바른 Restkit 요청을 수행하는 방법을 파악할 수 없었습니다 ...이 작업을 수행하는 올바른 방법이 있는지 조언하십시오. 기본 restkit/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. 할 수 있습니까? 아니면 적절한 restkit 방식으로 일괄 업데이트를하는 것이 좋습니까?

답변

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

일반 코어 데이터는 1 초 간격으로 테스트해야합니다.

+0

매력처럼 작동합니다. 그리고 꽤 빠릅니다. 왜 내가 그 성능에 대해 걱정하는지 모르겠다. – digitaljerry

관련 문제