2009-12-22 2 views
14

일부 비동기 통신 상황 (이벤트 기반 XML 구문 분석, NSURLConnection 응답 처리 등)을 다루고 있습니다. 내 문제를 간략하게 설명하려고합니다 :Objective-c 비동기 통신 : 대상/작업 또는 위임 패턴?

내 현재 시나리오에는 서비스 제공 업체 (xml 파서와 통신하거나 네트워크 통신을 할 수 있음)와 서비스 제공 업체에게 일부를 수행하도록 요청할 수있는 클라이언트가 있습니다. 작업을 비동기 적으로 수행합니다. 이 시나리오에서는 서비스 공급자가 처리를 완료하면 결과를 클라이언트에 다시 전달해야합니다.

나는 사물의 종류를 구현하는 패턴이나 엄지 손가락의 규칙의 종류를 찾기 위해 노력하고있어 나는 3 가능한 해결책을 참조하십시오

1. 위임 패턴 : 클라이언트가 서비스 제공 업체의입니다 위임하면 작업 완료시 결과를 받게됩니다.

2. 대상/액션 접근은 : 클라이언트는 작업을 수행하고 작업이 완료되면 서비스 제공자에 의해 호출되어야 할 것이다 선택기를 전달하는 서비스 제공을 요청합니다.

3. 알림을 사용하십시오.

(업데이트) 솔루션 # 2 (대상 및 작업)를 시도하는 동안 잠시 후, 필자는 위임 방법 (# 1)을 사용하는 것이 더 바람직하다고 결론을 냈습니다.

위임 방법 : 내가 그들을 보는 바와 같이 여기에 각 옵션의 장단점이 있습니다

  • 1 (+) 옵션 1의 상승이를 그 컴파일을 위해 우리가 할 수있는 확인 클라이언트가 서비스 공급자의 대리자 프로토콜을 구현해야하기 때문에 시간 오류이 발생합니다.

  • 1 (-) 위임 프로토콜을 구현해야하기 때문에 클라이언트가 서비스 공급자와 밀접하게 연결되기 때문에 이는 단점이기도합니다.

  • 1 (+) 그것은 쉽게 코드를 검색하고, 서비스 제공자는 결과를 전달하기 위해 호출하는 클라이언트의 어떤 방법을 찾을 수있는 프로그래머를 할 수 있습니다.

  • 1 (-) 클라이언트 관점에서 보면 서비스 제공자가 결과를 얻었을 때 어떤 메소드가 호출 될지 찾기가 쉽지 않습니다. 여전히 쉽습니다. 위임 프로토콜 방법으로 이동하면됩니다.하지만 그 방법은 # 2 방법이 더 직접적입니다.

  • 1 (-) 더 많은 코드를 작성해야합니다. 위임자 프로토콜을 정의하고 구현하십시오.

  • 1 (-) 또한 위임 패턴을 사용하여 동작을 위임해야합니다. 이 시나리오는 의미 론적으로 위임의 정확한 사례는 아닙니다.

액션/타겟 접근

  • 2 (+) 옵션 (2)의 상승이 서비스 제공자 메소드가 호출 될 때, 콜백 동작을 지정 @selector는 반드시 그 또한 지정 될 수 있으므로 프로그래머는 결과를 처리하기 위해 어떤 메소드가 다시 호출되는지 바로 알 수 있습니다.

  • 2 (-) 이와 반대로 서비스 제공 업체 코드를 탐색하는 동안 클라이언트에서 어떤 메소드가 다시 호출되는지 찾기가 어렵습니다. 프로그래머는 서비스 호출로 가서 어떤 @selector가 전달되는지 확인해야합니다.

  • 2 (+) 더 역동적 인 솔루션이며 부품 간 커플 링이 적습니다.

  • 2 (-) 가장 중요한 것들 중 아마도 하나 클라이언트가 서비스 제공 업체에 존재하지 않는 선택을 전달할 수있는 그것은, 런타임 오류 및 부작용가 발생할 수 있습니다. withArgument : withArgument : 서비스 제공자는 2 개 인자까지 전달할 수 있습니다 -

  • 2() 간단하고 표준 접근 방식 (#performSelector를 사용.

알림 : 나는 두 개 이상의 개체를 업데이트해야 할 때 사용할 수 해야하는 생각하기 때문에 내가 알림을 선택하지 않을

  • . 또한이 상황에서 결과를 작성한 후 대리인/대상 객체에 직접 말하고 싶습니다.

결론 :이 시점에서 위임 메커니즘을 선택했습니다. 이 접근법은보다 안전성을 제공하며 코드를 쉽게 찾아보고 대리인에게 서비스 공급자 작업 결과를 보내는 결과를 따르도록 허용합니다. 이 솔루션에 대한 부정적인면은보다 정적 인 솔루션이므로 더 많은 코드 (프로토콜 관련 내용)를 작성해야하며 의미 상으로는 서비스 제공 업체가 아무 것도 위임하지 않기 때문에 실제로 위임에 대해 이야기하는 것이 아닙니다. .

내가 누락 된 항목이 있습니까? 당신은 무엇을 추천하고 왜 그럴까요?

감사합니다.

답변

0

아주 좋은 질문입니다.

나는 자격이 있다고 생각하지 않는다. (나는 초보자이기 때문에) 어떤 디자인 패턴이 다른 디자인 패턴보다 낫다는 것에 대해 논평했다. 알림 - 그러나 당신이 점 2 (실행시 예외)에 언급 된 단점은 옵션

+0

감사합니다. Mihirsm, 맞아요. 런타임 오류가 발생하지 않습니다. 그러나 프로그래머가 잘못된 선택기를 사용했다는 사실은 런타임까지 표시되지 않습니다. 그러면 부작용이 생길 수 있습니다. S. 다시 말하면, 더 정적이지만 안전한 위임 메커니즘의 경우 더하기. 건배! – Lio

+1

@protocol을 구현하고 대리인이이 프로토콜을 준수하도록하면이 작업을 조금 더 안전하게 할 수 있습니다. 위임 클래스가 필수 메소드를 구현하는지 확인합니다. 또한 setDelegate : 메소드에 어설 션을 추가하여 새 객체가 프로토콜을 준수하는지 테스트 할 수 있습니다. –

+0

프로토콜에서 선언 된 메소드의 기본 방법은 그것들이'@ optional'이기 때문에'[delegate respondsToSelector : callback]'이 여전히 필요합니다. 프로토콜에서'@ required'를 사용할 수 있지만, 대부분의 사람들이 그렇게하지 않는다는 것을 알았습니다. 내 솔루션은'NSObject' 확장에 의해 리턴 된'NSProxy' 트램펄린을 생성하는 것이 었습니다. - [NSObject ifResponds]'. 당신이 그 모든 것을'말하자면 '말도 안되는 통사론적인 설탕. –

3

당신은 세 번째 옵션을 그리워 않았다 무게를하는 데 도움이

if([delegate respondsToSelector:callback]){ 
    //call to callback here 
} 

희망 방지 할 수 있습니다 언급하고 싶었다.

서비스 제공 업체로부터 새로운 데이터가 있음을 알리는 알림을 클라이언트가 관찰하도록 할 수 있습니다. 클라이언트가이 알림을 받으면 서비스 공급자의 데이터를 사용할 수 있습니다.

이렇게하면 멋진 결합이 가능합니다. 일부 결정은 푸시/풀 시스템을 원할지 여부에 달려 있습니다.

+0

감사합니다 Ciarán, 두 개 이상의 개체에 알림을 받아야 할 때 알림을 사용해야한다고 생각하기 때문에 알림의 무게를 재 었지 않습니다. 게다가 이런 종류의 상황에서는 (서비스 제공 업체 관점에서) 클라이언트와 직접 대화하여 작업이 완료되었음을 알리는 것이 더 낫다고 생각합니다. 물론 알림은이를 처리하는 또 다른 방법입니다. 아마도 나중에 알림을 포함하여 질문을 업데이트 하겠지만, 지금은 어떻게되는지보고 싶습니다. : D 다시 한 번 감사드립니다! – Lio

0

대표단 접근 방식의 또 다른 단점 : 서비스 제공 업체는 대표 만 가질 수 있습니다. 서비스 제공 업체가 싱글 톤이며 클라이언트가 여러 개인 경우이 패턴은 작동하지 않습니다.

이렇게하면 액션/타겟 접근 방식을 사용하게되었습니다. 내 서비스 제공 업체는 상태를 보유하고 있으며 여러 클라이언트간에 공유됩니다.