3

다음 작업을 수행 할 때 :글로벌 디스패치 대기열을 사용할 때 NSURLConnection 대리자 메서드가 호출되지 않는 이유는 무엇입니까?

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, NULL), ^{ 
    create NSURLRequest; 
    create NSURLConnectionDelegate; 
    create NSURLConnection; 
    start NSURLConnection; 
}); 

대리인의 메소드가 호출되지 얻을 않았다. 하지만 내가 할 때

dispatch_async(dispatch_get_main_queue(), ^{ 
    create NSURLRequest; 
    create NSURLConnectionDelegate; 
    create NSURLConnection; 
    start NSURLConnection; 
}); 

그들은 전화를받습니다. 왜?

UPD

이제 http://developer.apple.com/library/ios/#qa/qa1712/_index.html

내가 가있는 NSURLConnection을 만들려면 어떻게해야합니까; NSURLConnection 시작; 메인 스레드에

답변

3

첫 번째 경우에는 runloop이 실행되지 않는 작업자 스레드에 의해 대기열이 소모됩니다.

두 번째 경우에는 실행 대기열을 실행하는 응용 프로그램의 주 스레드에 의해 대기열이 소모됩니다. 따라서 위임 메소드는 해당 실행 루프에서 예약됩니다.

잘하면 Apple은 대기열 및 블록 기반 API를 곧 제공 할 것입니다. 한편, ASIHTTPRequest에 대해 생각해보십시오. 연결이 완료되면 (또는 실패 할 때) NSOperationQueue에 블록을 제출할 수 있습니다.

또는 NSURLConnection을 주 스레드의 runloop (또는 충분히 오래있을 특정 runloop)을 사용하도록 명시 적으로 구성 할 수 있습니다. 참조 - [NSURLConnection - scheduleInRunLoop : forMode :]

희망이 도움이 되었습니까?

관련 문제