2012-09-02 3 views
5

NSOperationQueue에서 동기 NSURLConnection 요청 (또는 주 스레드가 아닌 스레드의 동기 요청)을 만드는 작업을 추가하는 것과 주 스레드에서 비동기 요청을하는 것 사이의 차이점은 무엇입니까? ?스레드에서 NSURLConnection 동기 요청 대 비동기 요청

두 가지 모두 메인 스레드를 차단하지 않으므로 UI는 응답 성이 유지되지만 다른 인터페이스를 사용하면 이점이 있습니까? 나중에 요청 진행 상황 등을 추적 할 수 있지만 진행 상황과 기타 HTTP 항목은 중요하지 않다고 가정합니다.

답변

2

비동기 요청은 실행 루프에서 예약되고 실행 루프 소스로 설정되어 네트워크에서 수신 된 데이터가있는 경우에만 자동으로 코드를 트리거합니다 (소켓 소스와 동일).

NSThread에서 실행되는 동기 요청은 들어오는 데이터를 모니터하기 위해 스레드를 독점합니다. 일반적으로 상당히 과도합니다.

cancel 메서드를 사용하여 비동기 적으로 실행 한 경우에도 항상 NSURLConnection을 취소 할 수 있습니다.

나는 그것이 NSURLConnection가 예정된 때와 같은 방식으로 작동되도록 후드와 dispatch_source_create, 또는 이와 유사한에서 GCD를 사용하는 NSOperationQueue (+sendAsynchronousRequest:queue:completionHandler:)에 비동기 요청을 보낼 수있는 새로운 API를 사용하여 내기 반복 스레드를 사용하지 않고 (스레드가 악의적 인 이유와 사용량을 최소화해야한다고 설명하는 WWDC'12 비디오보기), 위임을 사용하는 대신 블록을 완료 할 때 알림을 사용할 수 있다는 점만 다릅니다 기구.

몇 년 전에 비동기 호출을 임베드하고 관리를 훌륭한 블록 API (내 github의 OHURLLoader 참조)에 포함시키는 클래스를 만들었습니다. 사용하기가 더 쉬워졌습니다. NSOperationQueue을 사용하는 새로운 API는 runloop에서 여전히 비동기 요청을 수행하면서도 위임을 구현하는 대신 블록을 사용할 수 있다는 동일한 원칙을 사용합니다.

2

과거의 입장은 비동기 요청에서 전력 소비 및 배터리 수명에 이점이 있다는 것입니다. 예를 들어 이전 델리게이트 접근 방식과 새로운 블록 기반 접근 방식을 모두 포함 할 수 있습니다.

+0

감사합니다. 요점이 있습니다. – msk

+0

의미가 있습니다. 새로운 블록 기반 접근 방식은 무엇입니까? 구체적으로 알려주십시오. 코드를 찾지 않고 Google에 문의해야 할 대상이 있으므로 일부 문서를 구할 수 있습니다. – Madbreaks

+2

@Madbreaks는 NSURLConnection + sendAsynchronousRequest : queue : completionHandler :'입니다. – Tommy

5

그들은 매우 유사합니다. 동기식 요청의 가장 큰 문제점은 쉽게 취소 할 수 없다는 것입니다. 응용 프로그램에 따라 문제가 될 수 있습니다. 큰 문서를 다운로드하고 사용자가 다른 화면으로 이동한다고 가정하면 더 이상 해당 정보가 필요하지 않습니다. 우리의 경우, 실제로 비동기 NSURLConnections를 보조 NSThread에서 선택했습니다. 일부 NAPhread는 과다한 애플리케이션 일 수 있습니다. 더 복잡하지만 두 번째 스레드에서 요청을 취소하고 JSON/XML/이미지 데이터를 디코딩 할 수 있으므로 주 스레드 사용자 상호 작용에 영향을주지 않습니다.

+0

대답 해 주셔서 감사합니다. – msk