2011-01-05 3 views
1

약 500 개의 객체로 이루어진 코어 데이터베이스가 있습니다. 이 객체는 사용자가보고 수정할 수있는 '카드'입니다. 사용자가 카드를 수정하면 'groupNumber'라는 속성이 변경됩니다.데이터 객체를 NSArray에로드하면 고통스럽게 느린 시작이됩니다.

각 그룹의 카드 순서는 매우 중요하며 사용자가 결정합니다. 데이터베이스 객체를 배열에로드합니다. 사용자가 변경을하면 'title'속성을 사용하여 배열의 순서를 plist에 저장합니다.

내 문제는 앱을 다시 실행하면 발생합니다. 저장 한 순서대로 그룹 배열을로드해야합니다.하지만 plist를 사용하여 가져 오기 요청을하면 고통스럽게 느립니다.

느린 코드는 다음과 같습니다

// get array from plist sorted by 'title' 
NSMutableArray *group1Temp = [plistData objectForKey:@"group1ArrayData"]; 

for (int i = 0; i < [group1Temp count]; i++) { 
    // set predicate to 'title' attribute 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"title == %@", [group1Temp objectAtIndex:i]]; 

    // load filtered database object into temp array 
    NSArray *temp = [self.vocabDeckArray filteredArrayUsingPredicate:predicate]; 

    [self.group1Array addObjectsFromArray:temp]; 
} 

이 500 회를 실행하면, 그냥 너무 느립니다. plist에 데이터베이스 객체의 NSArray를 저장할 수 있다면 조건부 검색을 수행 할 필요가 없지만 그렇게 할 수없는 것 같습니다.

내 전체 접근 방식이 잘못되었다고 생각합니다. 데이터베이스 개체 배열의 순서를 빠르게 저장 /로드하려면 어떻게해야합니까? 데이터베이스 객체를 배열 자체에로드하는 것이 좋지 않습니까?

도움 주셔서 감사합니다.

답변

1

전체 vocabDeckArray을 가로 지르고 group1Temp에있는 각 개체에 대해 한 번 필터링하는 것은 매우 비효율적입니다. O (n^2) 시간보다 작게 정렬 된 데이터 세트를 재구 축할 수있는 방법에는 여러 가지가 있습니다.

개체 제목을 키로 사용하고 배열의 위치를 ​​값으로 사용하여 사전을 저장할 수 있습니다. 그렇게하면 알려진 길이의 배열을 구성하고 vocabDeckArray에있는 모든 객체를 단일 패스에서 올바른 위치에 배치 할 수 있습니다. vocabDeckArray에서 첫 번째 객체를 가져오고 사전에서 group1Array에 속한 룩업을 group1Array에 삽입하고 다음 객체로 이동합니다.). 여전히 빠르지는 않지만 현재 행동에 대한 최소한의 변화처럼 보입니다.

또한 루프 내의 메소드 호출 수를 고려하십시오. self.vocabDeckArrayself.group1Array은 항상 동일한 객체를 반환하더라도 루프의 모든 반복에서 수행하는 메소드 호출입니다. 대신에 그 객체를 참조하는 지역 변수를 유지하면 반복 할 때마다 2 번의 메소드 호출의 오버 헤드를 줄일 수 있습니다.

+0

사전 대신 사전에 객체 제목 배열을 저장하는 것 외에는 말한대로 정확하게했습니다. 당신은 저에게 많은 작업을 저장했고 3 초 안에 앱이로드됩니다. 정말 고마워. – shohaku

관련 문제