2013-10-01 2 views
0

I가 for 루프 내에서 호출되는 여러 번 호출 다음의 방법, 메모 객체 생성하고 설정하기 위해있는 NSDictionary 객체를 통해 반복 할 때마다 :코어 데이터를

- (BOOL)updateById:(NSString *)entityId 
     withData:(NSDictionary *)dataDictionary { 


DLog(@"Updating %@", [_entityClass description]); 

if (_entityIdentifier == nil) { 
    DLog(@"entityIdentifier has not been set"); 

} 

NSManagedObjectContext *context = ContextForThread; 

id note = [_entityClass findFirstByAttribute:_entityIdentifier 
            withValue:entityId 
            inContext:context]; //This is running slowly ? 

[note setValuesFromDictionary:dataDictionary]; 

BOOL changes = YES; 
if ([note changedValues].count == 0) { 
    changes = NO; 
    DLog(@"Has NOT changed - Dont save"); 
} 
else { 
    DLog(@"Has changed"); 

} 

return changes; 

}

는이 코드를 최적화하려고하고 findFirstByAttribute 방법은 다소 느린 것 같다 것으로 나타났습니다. 어쨌든이 방법을 최적화 할 수 있습니까?

+0

루프에서이 메소드를 호출 할 때마다 'entityID'가 동일하거나 다른가? –

+0

안녕하세요 톰 - 때마다 다릅니다. – GuybrushThreepwood

+0

OK 한 가지 더 - 귀하의 질문에 그 목적은 "메모 개체를 만들고 설정하는 것"이라고되어 ​​있습니다. 하지만 코드는 객체를 찾는 것이 아니라 객체를 찾는 것입니다. 명확히 해 주시겠습니까? –

답변

1

색인을 생성 할 속성을 설정하면 조금 도움이됩니다. 이 메서드를 매우 자주 호출하면 일괄 업데이트를 수행하는 것이 좋습니다. MR_findAllWithPredicate를 사용하여 검색된 각 개체에 대한 단일 DB 쿼리와 업데이트 값을 만들 수 있습니다.

2

근본적으로 문제는 당신이 많은 페치를하고 있고 많은 페치가 많은 작업을한다는 것입니다. 여기에서 목표는 반올림 횟수를 줄이는 것입니다. 대부분 한 번에 모두 수행 한 다음 결과를 사용하도록 코드를 리팩토링해야합니다. 예를 들어, entityId 값은 사전에 공지되어 있다면 :

  1. entityId는 알려진 값을 이용하여 모든 인스턴스를 페치. MR이 이것에 대한 지름길을 가지고 있는지 나는 모른다. 핵심 데이터를 직접 사용하면 가져 오기와 함께 다음과 같이됩니다. 의 결과 _entityIdentifier의 값이 entityIds 배열에있는 모든 인스턴스 것 가져 오기 : 관리되는 객체와 할당 할 값의 사전 모두 통과하도록

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K in %@", _entityIdentifier, entityIds); 
    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey: _entityIdentifier ascending:YES]; 
    
  2. 것은 위의 방법을 리팩토링 그 대상에게.

다른 방법으로 접근 할 수 있지만, 각각 다른 페치를 수행하는 대신 여러 객체를 한 번에 가져와야합니다.