2011-01-31 1 views
4

내 응용 프로그램에 UISearchbar가 있습니다. 이것은 동적 검색이며 사용자가 텍스트를 입력하면 원격 API 호출을 통해 원격 데이터베이스를 검색합니다 (REST를 통해 생각합니다).지연 UISearchbar 구문 분석

테이블보기는 사용자가 입력 할 때 동적으로 새로 고쳐집니다. NSXMLParser XML 결과를 구문 분석하는 데 사용하고 있습니다. (따라서 3 가지 대리자 메서드, didStartElement, didEndElement)

결과에 중복 항목이 표시되는 경우가 있습니다 (예 : ). 사용자가 YAH를 입력하면 YAHOO가 3-4 회 표시됩니다. 이유가 확실하지 않습니다.

구문 분석 횟수를 줄이거 나 구문 분석을 지연하여 사용자가 입력/삭제 한 모든 문자를 요청하지 않도록하려면 어떻게해야합니까?

이것은 문제를 해결할 수 있다고 가정합니다.

+0

나는 모든 종류의 해결책/가능한 수정본을 공개합니다. – hmthur

+0

가능한 몇 가지 추가 수정 사항을 제공해주십시오. – hmthur

답변

10

당신이 할 수있는 한 가지는 모든 문자에 대해 하나의 쿼리를 보내는 대신 원격 API 호출을 보내기 전에 지연을 도입하는 것입니다.

// Whenever UISearchbar text changes, schedule a lookup 
- (void)searchBar:(UISearchBar *)theSearchBar textDidChange:(NSString *)text { 
     // cancel any scheduled lookup 
     [NSObject cancelPreviousPerformRequestsWithTarget:self]; 
     // start a new one in 0.3 seconds 
     [self performSelector:@selector(doRemoteQuery) withObject:nil afterDelay:0.3]; 
} 
+0

doRemoteQuery의 경우 매개 변수를 전달하려면 어떻게 작성해야합니까? – hmthur

+0

매개 변수를 사용하여 메소드를 작성한 후'[self performSelector : @selector (doRemoteQuery :) withObject : myObject afterDelay : 0.3]; ' –

+0

매개 변수를 전달하려면'withObject : myParameter'를 작성하십시오. 대신'withObject : nil'을 사용합니다. 주의 :이 경우 매개 변수 객체에 사용하는 유지/해제 메커니즘을주의 깊게 생각해야 메모리를 누출하거나 너무 빨리 객체를 놓을 수 있습니다. –

0

다음은 웹 서비스 결과에서 중복 된 항목을 제거하는 데 사용하는 방법 중 관련 부분입니다.

NSMutableArray *mutableResults = [[myResults mutableCopy] autorelease]; 
NSMutableSet *duplicates = [NSMutableSet set]; 
NSMutableIndexSet *indexesToRemove = [NSMutableIndexSet indexSet]; 

for (NSString *result in mutableResults) 
{ 
    if (![duplicates containsObject:result]) 
     [duplicates addObject:result]; 
    else 
     [indexesToRemove addIndex:[mutableResults indexOfObject:object]]; 
} 

[mutableResults removeObjectsAtIndexes:duplicates]; 
return mutableResults; 
+0

당신의 솔루션은 내가 찾고있는 것일 것 같습니다. 그러나 나는 질문이있다. 나는 2 개의 전망이있다; 목록 및 세부 정보. 목록보기에는 검색 막대가 있으며이 목록보기의 행은 웹 서비스 결과에서로드됩니다. 상세 뷰는 공유 싱글 톤 배열을 사용하여 데이터를 표시합니다. 그러면 솔루션이 목록보기를 수정하는 것 같습니다. 자세히보기는 어떻게 하죠? – hmthur

+0

전체 데이터 세트에 대한 상세보기 컨트롤러 액세스 권한을 부여하는 대신 배열의 한 항목에 대한 데이터를 목록보기에서 상세보기로 전달해야합니다. –