2011-02-02 1 views
0

NSXMLParser를 사용하여 내선을 구문 분석합니다. API 데이터. 또한 extton API에서 검색 한 정보를 유지하기 위해 Singleton 공유 배열 var를 사용합니다.중복 검색 결과 및 XMLParser 배열 새로 고침과 관련된 문제

이 정보는 동적이며 지금은 일이 내가 사용하여 기존 배열의 내용을 삭제, 사용자 유형 아무것도 즉시이다

UISearchBar

에서 사용자 유형 아무것도 changesas [retrievedArray removeAllObjects]

따라서 검색 막대의 현재 용어를 기반으로 retrieveArray를 새로 고칩니다.

사용자가 느리게 입력하면 정상적으로 작동합니다. 그러나 사용자가 매우 빠르게 입력하면 중복 검색 결과가 표시됩니다. retrieveArray 내용이 지울 충분한 시간을 갖지 않기 때문에 이것은 가정합니다.

아직 문제를 해결하기 위해 노력하고 있습니다. 제발 좀 더 수정을 제안하십시오.

해결해 주시겠습니까?

답변

0

아니요, 다른 스레드에서 별도의 스레드 및 클리어 어레이에서 검색을 수행하지 않는 한 그렇다고 생각하지 않습니다. 그렇지 않으면 검색 로직에 오류가있을 수 있습니다.

+0

[NSAutoreleasePool alloc] init]; [self setURL : url]; \t NSThread myThread * = [NSThread ALLOC] initWithTarget : 자기 선택기 : @selector을 (시험 : \t \t \t \t \t \t \t \t \t \t \t \t 개체 : 닐]; [retrievedArray removeAllObjects]; \t [myThread start]; [풀 릴리스]; 스레드없이 시도했지만 여전히 빠른 타이핑에 문제가 있습니다. 다른 문제를 제안 해주십시오. – testndtv

+0

아니요, 스레드를 사용하는 것이 좋습니다. 배열에 액세스 할 때마다 @synchronize (retrievedArray) {}를 사용해야합니다. – Max

+0

약간의 트릭을 제안 할 수 있습니다 : 메소드 정의 - (void) clearArray {@synchronized (retrieveArray) {[retrievedArray removeAllObjects]; }} 그리고 다른 하나, 즉 - (void) appendArray {// 여기에 데이터로 배열 채우기} NSLog를 배열의 크기를 출력 할 수있는 메소드에 넣으십시오. 그리고 변화하는시기를 알 수 있습니다. 트레드 ID를 인쇄 할 수도 있습니다. – Max

0

우선 싱글 튼 접근법은 자신이하는 일에 최선의 방법이 될 수 없다고 생각합니다. 그러나 배열에 대한 모든 변경 가능한 액세스를 동기화하고 있는지 확인하십시오. 싱글 톤이 모든 객체와 그 객체 (super)에 대해 NSMutableArray을 반환하는 대신, addObject, removeObject, clear, @synchronize 블록 또는 사용자가 결정하는 잠금 장치와 같은 메소드가 필요합니다. addObject, remove 및 clear 코드를 호출하는 코드가 모두 동기화되어야하기 때문에이 방법에 대한 문제가 계속 발생합니다. 대리인을 사용하거나 타임 스탬프, 사용자가 데이터를 가져 오기 위해 입력 한 문자 및 결과가 NSArrayNSNotification을 게시하는 각 자동 완성 요청을 고려해 볼 수 있습니다. 그 때 당신은 응답이 여전히 유효한 경우, 참조 유효하지 않은 응답을 폐기하고, 유효한 가장 최근의 단지 내용으로 사용자를 업데이트 할 수 있습니다 NSArray

예, 스레드 NSAutoreleasePool을 * 풀 = [사용 @Max