2013-02-27 2 views
3

주어진 ID로 CommunicationLink 객체를 만들기 위해 서버 (POST)에 대한 비동기 요청을하는 메소드가 있습니다 (method1). 요청을 보내기 전에 메서드는 CommunicationLink가 이미 서버에 있는지 확인합니다.계속하기 전에 부울 값이 변경 될 때까지 대기

주어진 CommunicationLink ID와 관련된 "Topic"개체의 목록을 가져 오는 두 번째 방법 (method2라고 부름)이 있습니다. method1처럼 method2은 CommunicationLink가 이미 서버에 있는지 확인하고 그렇지 않은 경우 서버에 비동기 요청을 보내서 다시 만듭니다.

내가 가진 문제는 내가 내 응용 프로그램을 시작할 때, method1method2이 하나씩라는 것을, 그래서 이런 식으로 뭔가와 끝까지 : 서버에 따라서

method1 checks if CommunicationLink exists ---> NO 
    method1 sends a request to create CommunicationLink (async call) 

method2 checks if CommunicationLink exist ---> NO because the previous call is not done yet 
    method2 sends a request to create CommunicationLink 

    method1 done 
    method2 done 

, 나는 결국 동일한 ID에 대해 2 개의 CommunicationLink가 있습니다 (서버 측에서 무슨 일이 일어나는지 제어 할 수 없음)

method1이 이미 서버에 요청을 보낸 경우 method2을 "일시 중지"하는 가장 좋은 방법은 무엇입니까? method1에있는 호출 전에 true에 부울을 설정하고 요청이 완료되면 false으로 다시 설정하고 while (!myValue);method2에 넣을 수 있지만 더 좋은 방법이 있다고 생각합니다.

편집

정적 라이브러리의 일부가 내가 푸시 알림을 처리하기 위해 일하고 있어요 경우이 코드. 나는 "라이브러리를 사용하는 테스트 응용 프로그램 작업도 해요. method1

CommLink를 생성

- (void)sendProviderDeviceToken:(NSData *)deviceToken contextUUID:(NSString *)contextUUID sourceUUID:(NSString *)sourceUUID topicUUID:(NSString *)topicUUID language:(NSString *)language; 

방법 내 루트 뷰의 viewDidLoad

방법 항목에라고 - (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken;method2에서 호출

- (void)createCommunicationLinkWithSuccessHandler:(void (^)(NSNumber *))successHandler errorHandler:(void (^)(NSError *))errorHandler; 

2 방법 2

- (void)retrieveSubscriptionForContext:(NSString *)contextUUID notificationTopic:(NSString *)notificationTopic completion:(void (^)(NSDictionary *))completion; 

내 라이브러리에서이 사례를 직접 처리하고 테스트 응용 프로그램을 수정할 필요가 없습니다. method1method2은 같은 스레드에서 호출됩니다.

감사

가장 좋은 방법은 뮤텍스를 사용하는 것입니다 물론

답변

2

주요 포인트는 당신이 다루고있는 방법이다. 콜백은 두 번째 단계를 실행/트리거합니다.

NSURLResponse/Connection 또는 다른 네트워킹 프레임 워크 (AFNetworking 등)를 사용하는 경우 이러한 종류의 콜백 메커니즘을 사용할 수 있습니다 (일부 대리자 메서드 나 일부 완료 블록의 형태가됩니다). 네트워크 요청). 자세한 정보는 더 자세히 알려주십시오.

또 다른 접근 방식은 별도의 스레드에서 method1/method2 워크 플로우를 관리해야하므로 UI를 차단하지 않고 대기 할 수 있지만 훨씬 더 복잡합니다.

편집 :

당신은 체인 방법 2의 실행 방법 항목하도록

(^)(NSNumber *))successHandler 

인수를 사용할 수 있습니다. 당신이 무엇을 할 수 있는지

또는는 다음과 같다 :

  1. method1를 실행, 앱이 응답을 기다리고 있음을 말하는 플래그를 설정;

  2. (즉, successHandler 또는 errorHandler), 플래그를 재설정하십시오.

  3. viewDidLoad을 실행하기 전에 응답을 기다리지 않고 method2을 실행하고 method2을 실행하십시오.

위임자와보기 컨트롤러에서 액세스 할 수있는 일종의 상태 정보를 만들어야합니다.

희망이 있습니다.

편집 2 :

계정에 첫 번째 네트워크 요청이 완료 전에 뷰 컨트롤러 를로드 할 수 있다는 사실을 유지하기 위해, 나는 이것을 제안 :

  1. 요소를 viewDidLoad에서 method2 네트워크 요청 및 추가 처리 (따라서 viewDidLoad 외부에서 호출 할 수 있습니다.)

  2. NSNotificationCenter 알림을 위해 옵서버로 위에서 정의한 방법을 등록하십시오.

  3. viewDidLoad에서 method1 네트워크 요청이 아직 진행중인 경우 1 단계에서 정의한 메서드를 호출하지 마십시오.

  4. 어떤 이해 당사자가 첫 번째 연결이 설정된 것으로 알 수 있도록 successHandler이 알림을 게시 할 수 있도록, 여러분의 응용 프로그램 위임 method1 전화;

    4b. 2 단계에서 등록 된 알림 관찰자 덕분에 컨트롤러가 상태를 업데이트 할 수 있으며 (결국 method2) 호출 할 수 있습니다.

앱을 변경해야합니다. 즉,보기 컨트롤러가 method2을 실행할 수없는 "오프라인"모드를 지원하고 전체 상태 (응답 없음, 응답 없음 등)에 따라 사용자에게 몇 가지 정보를 표시합니다.

+0

나는 method1과 method2의 서명과 세부 사항을 가지고 내 게시물을 편집했습니다. –

+0

매우 유용합니다. 제발 내 편집을 참조하십시오 ... – sergio

+0

고마워요. 당신이하는 제안은 정확하게 내가하고 싶었던 것입니다. 유일한 문제는 다음과 같습니다. "응답을 기다리지 않고 method2를 실행하십시오." 응답을 기다리는 경우 method2에 응답을 얻을 때까지 "대기"한 다음 지시 사항을 실행하는 방법이 필요합니다. 그리고 내 라이브러리에서 완료해야합니다 내 애플 –

0

:이 문제가 이런 종류의 표준 방법입니다.

pthread mutexes 또는 @synchronized 지시어를 사용할 수 있습니다 (사과 Threading Programming Guide 살펴보기).

+0

문제가 있습니다. 내 두 메서드는 동일한 스레드에서 호출됩니다. 나는 싱글 톤 클래스로 작업하고있다. –

+0

... 그리고 서버를 제어 할 권한이 없다고 생각 하시겠습니까? 완료시 서버가 메시지를 보냅니 까? – Saphrosit

+0

아니요, 서버를 제어 할 권한이 없습니다. 그리고 예, 서버가 완료되면 메시지를 보냅니다. 다음은 'method1'의 실제 서명입니다. - (void) createCommunicationLinkWithSuccessHandler : (void (^) (NSNumber *)) successHandler errorHandler : (void (^) (NSError *)) errorHandler; 나는 내 불법 값을 false로 설정할 수있을 것입니다. (while 루프를 사용하여'method2'를 막기로 결정한 경우) –

0

두 번째 방법을 기다릴 필요가 없다면 KVO를 사용하면 편리합니다. 개체를 observeValueForKeyPath:ofObject:change:context:으로 바꾸거나 다른 개체를 변경할 때까지 개체를 기다립니다.

"방법 항목이 CommunicationLink (비동기 호출)를 생성하기 위해 요청을 보냅니다"

당신이 콜백의 어떤 종류가 제공해야한다 : 여기

관련 문제