2012-11-17 1 views
4

나는 비동기 주위에서 머리를 쓰려고 노력하고있다. 파견, 다중 스레드 실행 루프 등 등NSURLRequest를 수행하고 dispatch_async를 사용하는 것과 반대되는 대의원에게 응답하는 것의 차이점은 무엇입니까?

의 차이는 무엇

:

1) 주어진 방법에 NSURLRequest하고있는 NSURLConnection을 작성하고 실행할 필요하고 우리가 대리자 메서드 (didReceiveResponse, didReceiveData에 응답을 , connectionDidFinishLoading 등) 및

2) 블록을 만들고 dispatch_async가 있습니까?

첫 번째 방법을 사용하면 위임 메서드에 대한 액세스 권한이 있고 (해당 개체에 대한 액세스 권한이 여전히 있습니까?) 위임 메서드를 실행하면 실행될 수 있습니다.

블록/디스패치 메소드를 사용하면 해당 블록 내에서 블록이 동 기적으로 처리됩니다. 그런 다음 메인 스레드로 돌아와 결과를 처리합니까? 예제 코드 내가보고있는 코드 :

dispatch_async(kBgQueue, ^{ 
    NSData* data = [NSData dataWithContentsOfURL: 
     kLatestKivaLoansURL]; 
    [self performSelectorOnMainThread:@selector(fetchedData:) 
     withObject:data waitUntilDone:YES]; 
}); 

데이터를받은 후 "self performSelector ...."가 수행됩니까? (동기 이전에 내가 의미했던 것은 아마도 잘못된 용어 일 것입니다.) 그리고 블록의 다음 라인은 우리를 주 스레드로 되돌려 보냅니다.

"waitUntilDone : YES"의 용도 또는 이유는 무엇입니까? 그것은 거기에 없으면 다른 것들은 메인 스레드에서 일어날 수 없기 때문입니까?

위의 첫 번째 방법은 여전히 ​​주 스레드에서만 수행됩니까?

마지막으로 웹 페이지에 대한 JSON 쿼리의 경우 장단점은 무엇입니까? 다른 방법보다 한 가지 방법의 큰 이점이 있습니까?

+0

나는 오늘 밤에 이것을 배우고 이해하려고 노력하면서 나는 내가 더할 것이라고 생각했다. (사실, 더 많은) 탭이 열려있다. 대부분의 예제가 완전히 다르기 때문에 두 가지를 관련 지을 수 없었습니다. 또한, 나는 (테스트 목적을 위해) 내 애플 리케이션에서 두 가지 다른 방식으로 똑같은 일을하려고 노력 해왔다. 그러나 나는 계속 잘못 이해하고있다. "waitUntilDone"매개 변수와 관련하여, 그것은 블록의 마지막 동작이고 관련성이 없기 때문에 나에게는 매우 불투명 해 보입니다. 그러나 나는 단지 짐작하고있다. – Madivad

답변

2

1) 메인 스레드 나 NSOperation에서 NSURLConnection을 사용할 때 언제든지 중단하고 진행 상황을 추적 할 수 있습니다. 당신이 돌아 오는 것은 다양한 일이 일어 났을 때 델리게이트 방법이지만, 당신은 앉아서 뭔가를 기다리는 것이 아닙니다. 언제든지 중지하려면 취소 한 다음 퇴실 (또는 거부) 할 수 있습니다.

2)이 부분을 확인하십시오. 주 스레드에서이 호출을 수행하면 성공 또는 실패 할 때까지 대기합니다. 일단 시작되면 성공 또는 실패로 돌아 가야합니다. 메인 스레드에서 UI를 차단할 수 있습니다. 블록에 넣고 다른 스레드에서 실행하면 동일한 작업이 수행됩니다. 선택한 스레드는 메서드가 끝날 때까지 차단됩니다. 결과를 보내기 위해 '자기'를 사용하면 자기가 유지됩니다. 그래서 자기가 UIViewController라고한다면, 당신이 그것을 튀어 나오더라도 (제거 될 것이라고 생각 함),이 메소드가 완료 될 때까지 주변에 머무르며, 천국은 무엇을하는지 알고 있습니다. 이 사용법은 매우 위험하며 자주 작동하지만 장치에 진부한 삽입 연결이있을 때 치명적인 오류가 발생합니다 (예 :).

대기 시간은 스레드를 동기화하는 것입니다. 메소드가 주 스레드에서 실행되었음을 알고 싶을 경우에만 진행하고 YES를 사용하십시오. 메서드가 대기열에 들어가고 (이 경우처럼) 완료 되었다면 그냥 NO 만 사용하면됩니다.

이 메서드는 주 스레드에 있어야합니다.이 방법으로 Apple에서 약속합니다.

3) JSON

내가 NSOperations 또는 블록에서 NSURLConnections를 사용 알고 사용자의 대다수. 작업을 취소 할 수 있습니다 (연결을 취소합니다). 아무리 많은 작업이 있더라도 '뒤로'버튼 누르기를 처리 할 수 ​​있습니다. 쿼리가 실패하면 html 상태를 볼 수 있습니다 (시간 제한 등 400 또는 500 오류가 발생 했습니까?)

Github에는 거의 200 줄의 코드가 들어있는 오픈 소스 프로젝트가 있습니다. 데모 코드를 사용하여 작업을 실행하는 도우미 클래스를 쉽게 사용할 수 있습니다 : /NSOperation-WebFetches-MadeEasy. 나는이 코드를 스토어에서 여전히 8 개 이상의 앱에 사용하여 큰 성공을 거두었습니다. 단일 OperationsRunner는 종종 수백 개의 페치를 동시에 처리하며 여러 클래스에서 OperationsRunners를 동시에 실행합니다.

NSOperation에서 JSON을 처리하면 여러 코어가있는 장치에서 실제 속도가 향상됩니다.

+0

@ 2 번에 대해 @David 감사합니다. "fetcheddata"메소드에서 수행되는 작업이 UI에 무언가를 표시하는 것일 뿐이라면, 메인 스레드를 멈추고 있습니까? 디스패치 _ 동기화의 아이디어라고 생각했는데, 메인 실행 루프가 계속되고 주기적으로 돌아 오는 점에서 옵션 1과 거의 비슷하게 수행되었습니다. – Madivad

+0

또한 첫 번째 옵션이 주 스레드에서 여전히 수행되지 않습니까? 즉, 방금 작업을 만드는 일부 스레드없이 NSURLConnection을 사용한 적이 있습니까? 나는 그들이 모두 메인 스레드에서 작동하는 것을 보았 기 때문에 주로 혼란 스럽다고 생각합니다. 나는 분명히 당신이 진술 한 이유 때문에 선택 1을 선호합니다. 링크에 대해서도 감사 드리며, 오늘 밤에 그걸 파헤쳐 보겠습니다. 잘하면 모든 것이 조금 더 좋아질 것입니다 :-) – Madivad

+0

두 가지 점은 NSData 메서드의 모든 작업 자체가 다른 스레드에서 수행된다는 것입니다. 어떤 스레드로부터 호출되었는지에 관계없이 완료 될 때까지 차단됩니다. 최종 fetchedData : 메소드는 사실상 아무런 시간도 필요치 않습니다. 지정된 스레드의 runloop에 대기 중입니다. 1)에서 작업은 주 스레드에서 수행되지만 차단은 발생하지 않습니다. 델리게이트 메서드는 신속하게 실행되며 필요에 따라 취소 할 수 있습니다. 따라서 귀하의 UI는 반응 적입니다. 연결 수가 적 으면 좋을 것입니다. 백그라운드에서 실행되는 수백 가지 작업을 사용하면 대부분의 사람들에게 더 잘 작동합니다. –

관련 문제