0

나는 어떤 종류의 멀티 스레딩에 익숙하지 않고 단순히 배경 스레드에서 제대로 작동하는 간단한 검색 방법을 얻지 못하는 것 같습니다. NSAutoreleasePool과 UI가 주 스레드에서 업데이트되면 모든 것이 순서대로 진행되는 것 같습니다. 응용 프로그램이 충돌하지 않고 백그라운드에서 검색을 수행하지만 검색 결과는 내가 입력하는 속도에 따라 여러 번 같은 항목을 여러 번 나타냅니다. 검색은 주석 처리 된 다중 스레딩없이 제대로 작동하지만 많은 양의 데이터로 인해 매우 느립니다.iPhone 멀티 스레드 검색

- (void)filterContentForSearchText:(NSString*)searchText { 
isSearching = YES; 
NSAutoreleasePool *apool = [[NSAutoreleasePool alloc] init]; 

/* 
    Update the filtered array based on the search text and scope. 
    */ 

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


for (Entry *entry in appDelegate.entries) 
{ 
    NSComparisonResult result = [entry.gurmukhiEntry compare:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:NSMakeRange(0, [searchText length])]; 
    if (result == NSOrderedSame) 
    { 
    [self.filteredListContent addObject:entry]; 
    } 
} 

[self.searchDisplayController.searchResultsTableView performSelectorOnMainThread:(@selector(reloadData)) withObject:nil waitUntilDone:NO]; 
//[self.searchDisplayController.searchResultsTableView reloadData]; 

[apool drain]; 
isSearching = NO; } 

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString { 
    if (!isSearching) { 
     [self.filteredListContent removeAllObjects]; // First clear the filtered array. 
     [self performSelectorInBackground:(@selector(filterContentForSearchText:)) withObject:searchString]; 
    } 
    //[self filterContentForSearchText:searchString]; 

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

답변

0

몇 가지 :

  • 멀티 스레딩은 단일 코어 CPU에 어떤 성능 향상을 가져 오지해야 여기에 코드입니다. 만약 당신이 위대한 speedups을 볼 생각, 아마도 귀하의 알고리즘은 물고기입니다.
  • 공유 변수에 액세스하는 경우 스레드가 안전한지 확인하십시오. 검색 결과를 하나의 공유 객체로 작성하는 것 같습니다. 동기화하지 않으면 실패합니다.
  • 그 코드는 모든 스레드가 정확히 동일한 데이터 세트에서 작동하는 것처럼 보이므로 한 스레드가 일치하는 것을 발견하면 다른 스레드는 동일한 것을 찾고 거기에 넣습니다.
  • 메인 스레드에서 액세스 할 때 "결과 개체"에 대한 액세스를 동기화하는 것을 잊지 마십시오.
0

NSOperation을 살펴볼 수 있습니다. NSOperation의 하위 클래스를 만들고 게시 한 파일에 구현 된 클래스의 속성으로 추가하는 것을 고려하십시오.

는 다음에 - (BOOL) searchDisplayController : (UISearchDisplayController *) 컨트롤러 shouldReloadTableForSearchString : (있는 NSString *)되는 searchString {

당신은 검색 데이터 및 텍스트에 대한 포인터와 객체를 설정할 수 있습니다. 그런 다음 개체가 현재 실행 중인지 (내가 생각하는) 확인할 수 있습니다. 그렇다면 '취소'를 호출하고 새 검색 문자열로 다시 시작하십시오. 좀 더 똑똑한 방법이 있을지 모르지만 NSOperation이 시작하기에 좋은 장소라고 생각합니다.