2010-05-13 1 views
1

나는 3000 개가 넘는 항목이있는 표가 있으며 검색 속도가 매우 느립니다.UISearchbar를 사용하여 검색하면 느려지고 기본 스레드를 차단합니다.

- (void) filterContentForSearchText:(NSString*)searchText 
{ 
// Update the filtered array based on the search text 

// First clear the filtered array. 
[filteredListContent removeAllObjects]; 

// Search the main list whose name matches searchText 
// add items that match to the filtered array. 
if (fetchedResultsController.fetchedObjects) 
{ 
    for (id object in fetchedResultsController.fetchedObjects) 
    { 
     NSString* searchTarget = [tableTypeDelegate getStringForSearchFilteringFromObject:object]; 

     if ([searchTarget rangeOfString:searchText 
       options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch)].location != NSNotFound) 
     { 
       [filteredListContent addObject:object]; 
     } 
    } 
} 
} 

내 질문은 두 가지이다 : 다음과 같이 그냥

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString 
{ 
    [self filterContentForSearchText: searchString]; 

    // Return YES to cause the search result table view to be reloaded. 
    return YES; 
} 

그리고 filterContentForSearchText의 방법 'TableSearch'예제 코드에서 (그러나 범위없이) 같은 일을하고있는 순간

입니다 :

  • 어떻게 검색 프로세스를 빠르게 수행 할 수 있습니까?
  • 어떻게 검색을 중단하여 메인 스레드를 차단할 수 있습니까? 즉 사용자가 더 많은 문자를 입력하는 것을 막습니다.

두 번째 부분에서는 "performSelector : withObject : afterDelay :"및 "cancelPreviousPerformRequests ..."를 많이 시도하지 않았습니다. 대신 스레딩을 사용해야 할 것으로 생각되지만, 많은 경험이 없습니다.

답변

0

(대문자와 소문자를 구별하지 않는 비교 사건에 대한) 정규 표현식 비교를 정의 할 수 있습니다. 나는 또한 Reinhard가 제안했고 fetchedResultController을 사용했다.

사과 개발자 사이트의 NSOperations에는 정말 좋은 동영상이 있습니다. 내가 기억한다면 Advanced iPhone part 1과 같은 이름으로 불렸다.

1

답변 : "검색 프로세스를 어떻게 더 빨리 만들 수 있습니까?"

핵심 데이터 결과를 테이블에 사용하고 있다는 것은 솔기가 있습니다. 따라서 핵심 데이터가 필터링을하는 것이 좋습니다.

필터링을 위해 NSPredicate를 사용하여 새로운 fetchedResultController를 만듭니다. 대신 =의

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = %@", searchText]; 
[fetchRequest setPredicate:predicate]; 

사용하여 일치하는 당신은 내가 메인 스레드를 차단하지 않도록하는 NSOperation으로 검색을하고 결국

+0

예, 좋습니다. – Robert