2010-02-05 2 views
4

좋아, 아주 간단한 질문 일지 모르지만 나는이 문제를 해결하는 가장 좋은 방법에 조금 갇혀있다.NSURL 연결이 완료되기를 기다리는 동안 objective-c 메소드 실행을 어떻게 막으시겠습니까?

iPhone SDK를 사용하여 objective-c 응용 프로그램을 코딩하고 있습니다. 일부 사용자 지정 개체가 있습니다. 이러한 객체는 NSURL 요청을 실행하고 데이터를 웹 서버로 보내고 데이터를 검색하고 계속 이동합니다.

내 문제는 내가 인증 할 서버에 초기 요청이 있습니다. 이 요청이 성공하면 다음 요청에서 사용할 세션에 대한 정보가 반환됩니다. 시작시에 응용 프로그램을 인증하고 첫 번째 후속 요청을하려면 첫 번째에서 두 번째를 수행하는 데 필요한 데이터가 필요합니다. 내 문제는 목표 - C에서 요청 개체에 메시지를 보내 요청을 실행하고 결과로 변수에 데이터를 반환 할 때입니다. 기본적으로 언어는 첫 번째 요청이 진행되는 동안 내 방법을 계속 실행합니다. 내 두 번째 요청은 아직 데이터를 반환하지 않은 첫 번째 요청으로 인해 성공할 수 없습니다.

나는이라는 것을 기억하지 않지만 그것은 절차 적 코드, 병렬 처리 또는 무언가 대 단일 스레드 코드를 실행의 라인에 무언가이다.

웹 요청을 보내는 개체가 반환 값을 얻을 때까지 내 메서드 실행을 유지하는 가장 좋은 방법은 무엇입니까?

나는이 작업을 수행하는 데 몇 가지 방법이있을 것이라고 확신하지만 '적절한'것으로 간주되는 것을 찾고 있습니다.

아래의 sudo 코드 예.

//First Request is sent obtaining some data that we will soon manipulate 
MyClient *client = [[MyClient alloc] init]; 
NSString *returnData = [MyClient runRequest]; 

//Call an object that now plays with the data and does some neat things 
CustomObject *CustomObj = [[CustomObject alloc] init]; 
[CustomObj dealWithResponse:returnData]; 
//Problem is now when I process the return data, it hasn't completed the first request from line 2 yet 

답변

4

당신은 "비동기"작업 대 "동기"에 대해 얘기하고. 동기 연산은 호출 코드와 함께 발생합니다. 대부분의 코코아는 이런 식으로 작동합니다. 객체에 메시지를 보내고 문자열을 포맷하는 등의 작업을하고 코드 줄이 "완료"될 때까지 작업이 완료됩니다.

그러나 현실 세계에서

, 일부 작업은 "순간"보다 오래 걸릴 (일부 집중적 인 그래픽 작업,하지만 디스크와 같은 주로 높거나 가변적 대기 시간을 가지 I/O 또는 악화, 네트워크 연결). 이러한 작업은 예측할 수 없으며 코드가 완료 될 때까지 차단해야한다면 무한히 또는 영원히 차단 될 수 있습니다.

그래서 우리는이 문제를 처리하는 방법은 "콜백"설정하는 것입니다 - 당신이 말하는 "꺼지고이 작업을 수행을하고, 작업이 완료되면이 다른 함수를 호출". 그런 다음 해당 "콜백"함수 내에서 첫 번째 작업에 따라 두 번째 작업을 시작합니다. 이런 식으로 대기중인 서클에서 회전하지 않고 각 작업이 완료 될 때 "비동기 적으로"호출됩니다.

NSURLConnection는 (다른 대기 시간이 객체와 같은)이 패턴을 따를 수 있습니다. 연결을 만들 때 delegate을 설정하면 결과 데이터를 사용할 수있을 때 특정 메서드에서 대리자가 호출됩니다. 이렇게하면 위임 메서드가 첫 번째 작업이 완료 될 때만 두 번째 작업을 시작하도록하여 작업을 serialize 할 수 있습니다.

+0

벤, 당신은 절대적으로 옳다. 일반적으로 콜백 함수가 여기로가는 길입니다. 여기 구현에 대해 좀 더 생각해 봐야겠다. 본질적으로 내가 바라는 것은 일종의 타임 아웃과의 동기식 연결이다. 최종 목표는 웹 서비스 호출을 할 수있는 클라이언트 객체를 가지며 짧은 시간 내에 응답이 돌아 오지 않으면 오류가 발생합니다. 응답이 다시 발생하면 UI 동작이 발생하고 다른 요청이 트리거 될 수 있습니다. 그러나 우리가 데이터 또는 오류를 기다리는 동안 나는 다른 전화를 할 수 없습니다. 대기열은 아마도? – Hazmit

+0

이 답변은 맞습니다. 즉시 반환해야합니다. 나중에 응답을 처리하는 콜백 함수는 데이터 처리 또는 오류 표시를 담당합니다. 이 개념을 이벤트 구동 프로그래밍이라고합니다. http://en.wikipedia.org/wiki/Event-driven_programming – Jacob

+0

동기화, 비동기 및 콜백의 +1 슈퍼 정의 –

0

NSURLConnection 설명서를 살펴보면서 동기 요청을 제출할 수있는 인스턴스 메소드를 발견했습니다.

프로그래밍 개념에 대한 Ben의 해답과 설명은 완전히 정확하며 질문에 대한 진정한 대답으로 생각해야합니다. 그러나 응답이있을 때까지 동기 요청을 제출하고 응용 프로그램의 실행을 차단하려는 사용자는 다음 방법을 사용할 수 있습니다.

sendSynchronousRequest:returningResponse:error: 

가있는 NSURLConnection

http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class/Reference/Reference.html#//apple_ref/occ/clm/NSURLConnection/sendSynchronousRequest:returningResponse:error 애플의 클래스 문서에서 찾을 수 있습니다