0
나는 내가 지금까지 함께 왔어요 패턴을 가져 오는

목표 - C (아이폰) 파견 가장 좋은 방법은 서비스 데이터

을 내 서비스를 설계하는거야 방법과 사투를 벌인거야

:

  • ServiceCaller (클라이언트가 사용하는 유일한 클래스가 될 것입니다. requestHello, requestLogon, requestUserDetails 등과 같이 webService의 특정 부분에 액세스하는 데 필요한 모든 메서드가 있습니다.)

  • ServiceConnector 서비스 호출자에서 인스턴스화됩니다. s 클래스는 서버에 대한 실제 연결을 수행하여 데이터를 요청하고이를 클라이언트로 다시 보내야하는 호출자에게 다시 반환합니다. 서비스 커넥터에서 요청 팩토리를 사용하여 요청 로직을 분리하고 웹 서비스는 파싱해야 함)

문제는 내가 어떻게 클라이언트에게 디스패치를 ​​처리 할 것인가입니다. servicecaller를 싱글 톤으로 만들려고 생각했기 때문에 servicecaller의 인스턴스가 1 개뿐이었고 서비스 커넥터의 인스턴스가 1 개 였지만 sametime에서 서버에 대한 다중 연결을 위해 열어 두었습니다.

등의 콜백을 처리하지만, 예를 들어 두 개의 호출이 두 개의 개별 뷰에서 수행되는 경우 델리게이트 속성을 변경합니다. 즉, 마지막으로 콜백을받는 콜백 만이 콜백을 수신하고 다른 콜백은 콜백을받지 않음을 의미합니다.

누구든지이 문제를 해결할 수있는 방법을 알고 있습니까?

답변

0

하나의 접근법은 다른 콜백 패턴을위한 위임 패턴 인 연속 스타일을 삭제하는 것입니다. 아이디어는 API가 매개 변수로 연속 차단을 사용하는 것입니다. 작업이 끝나면 단순히 연속 블록을 호출합니다. 여기 API 절차의 예는 다음과 같습니다

- (void) doSomething 
{ 
    [myServiceCaller answerTheDefinitiveQuestion:self.towel do:^(NSNumber * answer, NSError *error) { 
     if (!answer) { 
      NSLog("No answer available because %@, %@", error, error.userInfo); 
     } else { 
      NSLog("haha, Zaphod, your answer is %@, %@", answer); 
     } 
    }]; 
} 

참고 :

typedef void(^ContinuationBlock)(id result, NSError *error); 

- (void) answerTheDefinitiveQuestion:(Towel *)h2g2Towel do:(ContinuationBlock*) continuation 
{ 
    if (h2g2Towel) { 
     double answer = 7/h2g2Towel.length * (sqrt(h2g2Towel.area+2*h2g2Towel.area+1) - 1) * 6/h2g2Towel.width; 
     continuation([NSNumber numberWithDouble:answer], nil); 

    } else { 
     NSError *err = [[[NSError alloc] initWithDomain:H2G2Domain code:kMissingTowel userInfo:nil] autorelease]; 
     continuation(nil, err); 
    } 
} 

지금 클라이언트가 그런 식으로 사용할 수있는 예제는 동기하지만 비동기 상황에서 잘 작동합니다. 예를 들어 dispatch_async 호출에서 answerTheDefinitiveQuestion:do: 구현을 괄호로 묶을 수 있습니다.

실제로이 접근법은 모든 비동기 API에 매우 적합합니다. 기억할 수있는 유일한 점은 나중에 호출 할 연속 블록을 저장하면 복사본을 저장해야한다는 것입니다. 블록을 가져올 때 스택 기반이며 함수가 반환 될 때 사라지기 때문입니다. 간단히 :

self.myClientContinuation = [continuation copy]; 

추신 : 전체적인 생각은 사악합니다. 최소한 디자인 상으로는 ServiceCaller가 (ServiceConnector와 반대되는) 싱글 톤이되는 것은 아닙니다.