2012-03-19 3 views
0

사용자 검색을 한 다음 이름, 전화 번호, URL, 이메일 주소 등의 주소록 데이터에 대해 해당 검색어를 검색하고 싶습니다. 내 솔루션이 잘 작동하지만 느립니다. 주소록 데이터가 큰 경우 앱이 작동하지 않습니다. 주소록 데이터가 큰 경우에도 응용 프로그램이 멈추지 않도록 검색을 어떻게 최적화 할 수 있습니까?아이폰의 주소록에서 검색 결과 최적화

여기에 내 코드

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{ 
    [self takeSomeActionWhenTextChange]; 
} 

-(void)takeSomeActionWhenTextChange{ 
    [contactArray removeAllObjects]; 
    NSString *searchText=[[textSearchBar text] lowercaseString]; 


    for (int index=0; index<count; index++) { 
     ABRecordRef record=CFArrayGetValueAtIndex(people, index); 
     //[self checkStringISAddress:searchText withRecord:record]; 
     if ([self checkStringIsFirstName:searchText withRecord:record]==YES 
     || [self checkStringIsLastName:searchText withRecord:record] == YES 
     ||[self checkStringIsNote:searchText withRecord:record]==YES 
     || [self checkStringIsAddress:searchText withRecord:record]==YES 
     || [self checkStringIsCompany:searchText withRecord:record]==YES 
     ||[self checkStringIsEmail:searchText withRecord:record] 
     ||[self checkStringIsPhonenumber:searchText withRecord:record]==YES) 
     { 
      NSLog(@"object added inside Array"); 
      [contactArray addObject:record]; 
      [contactTableView reloadData]; 
     }else{ 
      NSLog(@"No Match For this object"); 
      [contactTableView reloadData]; 

     } 

    } 

} 

검색 쿼리 문자열은 이름, 성, 등등 이메일 &와 일치하는 경우 내가 확인합니다입니다. 위의 메소드에는 하위 문자열이 있는지 여부를 확인하는 논리가 포함되어 있습니까? ti가 일치하면 배열에 추가합니다.

내가 페르 탐 검색에 스레드 또는 GCD를 사용해야합니까? 그렇다면 어떻게됩니까? 테이블 뷰를 업데이트하려면 어떻게해야합니까?

답변

1

GCD를 사용할 수 있지만 여전히 사용자에게 어떤 일이 일어나고 있는지 보여주는 활동 표시기가 표시되어야합니다. 그것은 오직 메인 쓰레드 블로킹과 UI 잠금을 막을 것입니다.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

    //Perform the search 
    //perform your search here... 

    dispatch_async(dispatch_get_main_queue(), ^{ 

     //Update the UI 
     [self.tableView reloadData]; 
    }); 
}); 

당신은 또한 당신에게 몇 가지 청소기 논리를 줄 수도, 술어를 사용하여보다는 하위 문자열을 확인보고 할 수 있습니다 :

테스트, 당신은 물론 너무 다른 상수를 사용하여 큐의 우선 순위를 설정할 수 없음 .

+0

답장을 보내 주셔서 감사합니다. 수동 검사 대신에 NSPredciate를 사용해야합니까? 그렇다면 어떻게 술어를 사용할 수 있습니까? – iOSAppDev

+0

"NSPredicate"에 대한 SO 검색은 많은 예제를 제공합니다. 문서는 https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSPredicate_Class/Reference/NSPredicate.html –

+0

링크를 제공해 주셔서 감사합니다. 나는이 문서를 보았다. 하지만 내 문제는 어떻게 이름, 성, 주소, 메모, 이메일, ph no 등 모든 속성에 대해 내 검색어를 검색하기 위해 술어를 사용할 수 있습니까? 재산 당 하나의 술어를 사용해야합니까 아니면 다른 방법이 있습니까? 왜냐하면 내가 위에서 언급 한 모든 성분을 찾아야하기 때문이다. – iOSAppDev