2011-01-12 7 views
1

UISearchBar을 사용하여 사용자 입력을 기반으로 외부 API에서 동적으로 검색하는 앱이 있습니다.보조 스레드에서 UIKit을 호출하면 안되는 오류 메시지

앱이 외부 API를 정밀하게 검색하고 결과를 올바르게 표시하지만 검색 결과에서 행을 선택하면 화면이 멈추고이 오류가 발생합니다.

보조 스레드 나는이 문제를 해결할 수있는 방법을 전혀 생각이 없다

에서 호출 할 수 없습니다 메인 스레드 또는 웹 스레드 UIKit가 아닌 다른 스레드에서 웹 잠금을 얻기 위해 시도 .

다음은 코드입니다.

- (void) run: (id) param { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL: [self URL]]; 
    [parser setDelegate: self]; 
    [parser parse]; 
    [parser release]; 
    [delegate parseDidComplete]; 
    [pool release]; 
} 

- (void) parseXMLFile: (NSURL *) url 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    [self setURL: url]; 
    NSThread* myThread = [[NSThread alloc] initWithTarget:self 
               selector:@selector(run 
    object: nil]; 
    [myThread start]; 
    [pool release]; 
} 
+1

API 데이터를 어떻게 가져 옵니까? 다른 스레드에서 비동기 적으로 수행하는 것처럼 보입니다. UIKit은 스레드 세이프가 아니므로 UI ​​스레드는 항상 메인 스레드에서 수행되어야합니다. 관련 코드를 알려주시겠습니까? – Felix

+0

다음은 코드입니다. - (공극), 실행 (ID) {PARAM NSAutoreleasePool 풀 * = [NSAutoreleasePool의 ALLOC] INIT]; NSXMLParser * 파서 = [NSXMLParser의 ALLOC] initWithContentsOfURL : 자기 URL]; [파서 setDelegate : 자기]; [parser parse]; [delegate parseDidComplete]; } - (void) parseXMLFile : (NSURL *) url { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; [self setURL : url]; NSThread * myThread = [[NSThread ALLOC] initWithTarget : 자기 선택 : @selector (실행 대상 : 전무] [시작 myThread] } – hmthur

+0

를 외부 API 동안 화면이 정지되지 않도록 내가 스레드를 사용하고 액세스 할 수 있습니다. 그래서 내가 그렇게 할뿐만 아니라 해결할 UIKit 스레드 문제 ?? 을 BTW, 나는 (UIKit이 보조 스레드에서 호출 할 수 없습니다) – hmthur

답변

10

"는 메인 스레드 또는 이외 스레드에서 웹 잠금을 획득하려고 한 웹 스레드 UIKit해서는 안 보조 스레드에서 호출 수"

수정 개념적으로 간단하다 스레드에서 UI를 업데이트하지 마십시오.

가정하고 parseDidComplete는 메시지가 공급되는 경우,이 것 "작업"과 같은 무언가 :

[delegate performSelectorOnMainThread: @selector(parseDidComplete) withObject: nil waitUntilDone: YES]; 

"회사"스레딩 하드이며,이 대답은 완전히 당신이 가진 수있는 동기화 문제를 무시하기 때문이다.

NSOperationNSOperationQueue을 사용하는 것이 더 좋습니다. 그들은 잘 문서화되어 있으며 많은 예제가 있습니다.

+0

나는 NSOperation과 NSOperationQueue을 모른다. 참조로 사용할 수있는 NSOperation 또는 NSOperationQueue에 대해 비슷한 예제를 제공 할 수 있습니까? – hmthur

+1

설명서를 읽으십시오. 그것은 내가 입력 할 수있는 것보다 더 많은 정보와 더 좋은 예를 제공합니다. 이미'performSelectorOnMainThread'를 사용하여 구현 한 경우 NSOperation 및 대기열을 사용하는 장점은 무엇 – bbum

+0

@bbum? 이것에 대한 블로그 기사를 작성했다면, 그것을 읽었을 것입니다;) Thx. –

1

내가 줄 생각 것 : 대리자 클래스는 다음 XML 내용을 검색되는 백그라운드 스레드가 다음 어느해야 프런트 엔드 객체를 호출, UIKit 구성 요소와 상호 작용하는 경우

[delegate parseDidComplete]; 

을 모두 메인 스레드에 있어야합니다.

비동기 작업을 수행하려면 NSOperation 및 NSOperationQueue를 사용하는 것이 좋습니다. 나는이 유형의 유스 케이스를 다루는 더 스레드 세이프 한 방법을 제공한다고 믿는다.

+0

당신이 올바른지 확인합니다. 당신은 당신의 대답 AB에 그것을 추가 할 수 있습니다 비켜. –

관련 문제