2009-11-10 5 views

답변

22

동기는 사용자가 NSURLConnection 요청을 트리거하고 완료 될 때까지 기다리는 것을 의미합니다.

비동기 란 NSURLConnection 데이터를 다운로드하는 동안 요청을 실행하고 다른 작업을 수행 할 수 있음을 의미합니다.

어떤 것이 "최상"입니까?

동기식은 매우 간단합니다. 설정하고 실행하고 데이터가 돌아 오기를 기다립니다. 그러나 애플리케이션이 거기에 앉아서 모든 데이터가 다운로드되거나 오류가 발생하거나 요청 시간이 초과 될 때까지 아무것도하지 않습니다. 적은 양의 데이터를 처리하는 경우 사용자가 대기 상태에 머물러있어 사용자 만족도가 떨어집니다.

비동기는 작업이 조금 더 필요하지만 사용자가 요청을 처리하는 동안 다른 작업을 수행 할 수 있습니다. 이는 일반적으로 바람직합니다. 들어오는대로 데이터를 추적 할 수있는 일부 대리자 메서드를 설정하면 다운로드 진행률을 추적하는 데 유용합니다. 대부분의 사용 사례에서는이 방법이 더 좋습니다.

NSURLConnection으로 동기 및 비동기 요청을 모두 수행 할 수 있습니다. Apple의 documentation은 후자의 접근 방법에 필요한 두 가지 접근 방법과 대표 방법을 명확하게 설명합니다.

+0

어떻게 연결이 동기식 또는 비동기식으로 사용되는지 식별 할 수 있습니까? 다음 예제를 볼 경우 http://developer.apple.com/iphone/library/samplecode/SeismicXML/ 사용법을 알려주시겠습니까? 만약 connectionWithRequest : delegate : 비동기를 참조합니다. sendSynchronousRequest : returningResponse : error : synchronous를 참조합니다. 어떤 예는 NSUrl 연결을 사용하지 않았습니다. –

10

동기식/비동기식 연결과 스레딩이 서로 충돌하는 것 같습니다. 내 응용 프로그램에서 스레드 대신에 비동기 연결을 사용했습니다.

UI가 정지하지 않고 큰 파일을 다운로드하려고한다고 가정 해 봅니다. 두 가지 기본 옵션이 있습니다.

  1. 비동기 연결. + connectionWithRequest:delegate: (또는 다른 autorelease 옵션이 아닌)으로 시작하고 흥미로운 일이 발생할 때 위임자에게 전화하면서 파일의 비트를 다운로드합니다. runloop이 계속 진행 중이므로 UI가 반응 형으로 유지됩니다. 물론 위임자가 범위를 벗어나지 않도록 조심해야합니다.

  2. 동기입니다. + sendSynchronousRequest:returningResponse:error:으로 연결을 시작했지만 다운로드가 완료 될 때까지 코드가 대기합니다. 새로운 스레드 (또는 Cocoa가 지원하는 상위 레벨 스레딩 작업 중 하나)를 생성하거나 UI가 차단해야합니다.

"최선"또는 가장 고통스러운 옵션은 응용 프로그램의 아키텍처와 달성하려는 대상에 따라 다릅니다. 어쨌든 장기 실행 프로세스에 대한 스레드를 작성해야하는 경우 두 번째 옵션을 사용할 수 있습니다. 일반적으로 나는 첫 번째 옵션이 가장 쉽다고 말합니다.

모두 괜찮습니다. documented on Apple's Developer site.

3

다른 응답에서 언급되지 않은 내용은 요청의 크기입니다. 예를 들어 큰 파일을 다운로드하는 경우 비동기 연결을 사용하는 것이 좋습니다. 대리인은 도착하는대로 데이터 블록을받습니다. 비교해 보면 동기식 메서드는 모든 데이터를 사용하기 전에 대기합니다.대리인은 응답 처리 속도가 빨라지고 (사용자 환경이 개선됨) 메모리 대신 파일 (리소스 사용률이 더 높음)에 저장되도록 저장할 수 있습니다. 또한 모든 데이터를 기다리지 않고 응답을 중지 할 수있는 옵션이 있습니다.

기본적으로 비동기 방법을 사용하면 연결을 제어 할 수 있지만 복잡성을 피할 수 있습니다. 동기식 메서드는 훨씬 간단하지만 주 UI 스레드에서 차단해야하므로이를 사용하면 안됩니다.

2

파일 크기와 관련하여 다른 답변에 대한 답변 : 파일 크기가 중요하지 않다고 생각합니다. 서버가 매우 느리게 응답하고 데이터를 동기화하는 경우 3k와 같이 소량의 데이터를로드하더라도 UI는 여전히 정지됩니다.

모든 상황에서 비동기식 옵션을 사용하면 파일 크기, 서버 응답 속도 또는 네트워크 속도와 관련하여 어떤 결과를 얻을지 모를 수 있습니다.

관련 문제