2011-09-30 5 views
0

iPhone의 패턴은 현재 클래스에서 구현하는 비공식 프로토콜을 사용하여 ASync 연결 호출을 사용한다는 것을 알고 있습니다.iPhone에서 동기화 연결을 사용하면 문제가 있습니까?

필자의 경우 네트워킹 스태프를 수행하고 데이터를 ViewController로 반환하는 유틸리티 클래스를 만들었습니다. 그래서, (이럴 나쁜)

MyUtilityConnection* utilConn = .... 
while (true) 
{ 
    if ([utilConn checkUnderlyingAsyncConnectionFinishedLoading]) break; 
} 
NSData* dataFromUrl = [utilConn dataFromUnderlayingConn]; 

: 내가 찾을

는 R 나는 ViewControlle 그런 다음에 코드 블록을 쓰기 때문에 유틸리티 클래스에 비동기로 연결 모델을 구현하기 부적절하다 질문은, 아이폰에서 동기화 연결 모델을 사용하면 문제가 발생할 수 있습니까? 및 솔루션? 동기 연결을 할 수있는 모든 수단

답변

1

피하기을 (데이터가 ??? 올 때까지 매달려 stril 것이다 도면에 대한 어떤)

! 이것은 분명히 UI를 동결시킬 것입니다 (물론 좋은 대역폭을 가지지 않으면 악화됩니다).

데이터를 다운로드해야 할 때 블록 구문을 사용하여 더 읽기 쉬운 코드를 작성하면됩니다. NSURLConnection 대리자 메서드를 구현하는 클래스를 만든 다음 데이터가 완료되면 블록을 호출합니다.


는 (그리고 그 해결책은 단 하나입니다) 정확하게 수행 예를 들어, GitHub의 내 OHURLLoader 클래스를 참조하십시오.

사용 예 : 동기화 방법 중

NSURL* url = ... 
NSURLRequest* req = [NSURLRequest requestWithURL:url]; 

OHURLLoader* loader = [OHURLLoader URLLoaderWithRequest:req]; 
[loader startRequestWithCompletion:^(NSData* receivedData, NSInteger httpStatusCode) { 
    NSLog(@"Download of %@ done (statusCode:%d)",url,statusCode); 
    outputTextView.text = loader.receivedString; 
} errorHandler:^(NSError *error) { 
    NSLog(@"Error while downloading %@: %@",url,error); 
    outputTextView.text = [error localizedDescription]; 
}]; 
+0

블럭을 사용하지 않고 일반 셀렉터 나 함수 포인터를 사용하면 어떨까요? 그래서 저는 다음과 같은 것을 가질 것입니다 : My ViewController에서'MyUtilityConnection util = [MyUtilityConnection utilConn] urlConn whenDonePerformSelector : @selector (some_local_method_in_the_viewController_calss)];를 사용하고,'MyUtilityConnection' 클래스에 비동기 함수 데이터가 수신 될 때 구현자가 선택기를 호출? –

+0

그럴 수도 있습니다. 어쨌든 선택기를 호출 할 대상과 선택자를 매개 변수로 제공해야합니다. 함수 포인터에 대해 알고 있다면 블록에 대해 배우는 것에 관심이있을 수 있습니다. 기본적으로 블록은 함수 포인터와 매우 흡사합니다 (실제로는 해당 함수에서 영감을 얻은 구문과 매우 유사합니다). 그러나 더욱 강력합니다 (특히 변수를 캡처합니다 "클로저 (closure)"라고합니다). – AliSoftware

+0

블록에 대해 더 배우고 싶다면 [블록에 대한 짧은 실용 가이드] (http://developer.apple.com/library/ios/#featuredarticles/Short_Practical_Guide_Blocks/_index.html) 및 [블록 프로그래밍 토픽 ] (http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/00_Introduction.html) 페이지를 방문하십시오. _ 귀하가 혼란 스럽거나 앱을 호환 가능하게 만들려는 경우 4.0 이전의 iOS에서 타겟 + 셀렉터를 통과하여 블록 대신 완료 호출 - 좋고 완전히 수용 가능하지만 덜 섹시한 솔루션 _;) – AliSoftware

0

(sendSynchronousRequest:returningResponse:error:)이 UI는 무응답 (동기 방법은 메인 스레드라고 가정).

하지만 백그라운드 스레드에서는 괜찮 으면서 배경 스레드에서 동기화 호출을 수행하는 가장 쉬운 방법은 GCD입니다.

+0

GCD를 사용하는 것이 효과적 일지는 몰라도 Apple 문서 ([동시성 프로그래밍 가이드] (http://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/ConcurrencyandApplicationDesign/ConcurrencyandApplicationDesign.html)) 이미 비동기 적으로 (NSURLConnection' 비동기 메서드를 사용하는 것처럼) 작업을 수행하기 위해 SDK가 제공하는 API가있는 경우이를 사용하는 것이 낫습니다. _ (이 경우 NSURLConnection 비동기 메서드는 내부적으로 RunLoop에서 소켓 데이터 읽기를 예약하여 스레드를 만들지 않습니다.) _ – AliSoftware

+0

게다가 스레드 방식으로 가고 싶지 않습니다! –

+0

@ 코코아 푸, 고마워. :) –

관련 문제