2012-10-08 3 views
19

모든 뷰 컨트롤러에 대해 다운로드 할 객체를 만들고 있습니다. 객체는 싱글 톤 인스턴스이며 다운로드가 완료되면 수신 된 데이터가 포함 된 콜백 메소드가 있습니다. 또한 대리자 속성이 있으므로 다운로드가 완료된 후 다시 호출 할 개체를 알 수 있습니다.iOS의 여러 대리인

이 공유 인스턴스를 사용하는 컨트롤러가 여러 개 있습니다. 내 질문은 다운로드를 요청한 올바른보기 컨트롤러를 다시 호출하는 방법입니다.

내 접근 방식은 위임을 사용하는 것이지만 다른보기 컨트롤러도 위임하므로 다운로드 개체가 모든 개체를 다시 호출 할 수 있으며 추적하기가 어려울 수 있습니다.

+2

다운로드를 시작하라는 요청에 데이터 수신자에 대한 포인터가 포함될 수 있습니까? 그런 다음 각 요청의 수신자에 대한 대리자 메서드를 호출하면됩니다. – user1118321

+0

비슷한 문제가 발생하여 준비된 해결책을 찾았습니다. https://github.com/aleph7/MultiDelegate –

답변

42

사람들이 여러 대의원을 사용하려고 시도한 프로젝트에 참여했으며 기본적으로 나쁜 생각입니다. 델리게이트 패턴은 클래스와 델리게이트 사이의 1 대 1 관계입니다. 델리게이트를 안팎으로 전환하여 여러 수준의 여러 위임을 달성 할 수는 있지만 예측할 수없는 동작과 버그가 발생할 가능성이 큽니다.

내 생각에 어떻게 생각하고 있는지 생각해 보는 것이 좋습니다. 당신이 당신의 메인 클래스와 상호 작용 할 수있는 여러 관찰자를 등록 할 수있는 옵저버 패턴

  1. 스위치 : 나는 그것을 볼과 같이 두 가지 옵션이 있습니다. 이는 관찰자가 모두 동일한 프로토콜을 구현하고 관찰자와 상호 작용을 주 수업에서 인식하고자하는 경우에 유용합니다.

  2. 상태 변경 및 이벤트를 나타내는 브로드 캐스트 NSNotifications. 메인 클래스는 누가 듣고 있고 직접 그들과 상호 작용하지 않는지를 알 필요가 없기 때문에 좀 더 분리 된 접근법이 있습니다. 다른 사람들은 여가 시간에 통보를 받고 시작할 수 있습니다. 또한 별도의 프로토콜을 만들거나 구현할 필요가 없다는 장점이 있습니다. 대신 NSNotificationCenter를 사용하여 변경 사항을 알아야하는 클래스를 등록합니다. NSNotificationCenter는 모든 알림 라우팅을 처리합니다.

+3

설명해 주셔서 감사합니다. NSNotification은 나를 위해 아름답게 일했습니다. – guptron

+0

조금 늦었지만 비슷한 문제가있는 사람은 게시자/구독자 패턴을 확인하십시오. – salocinx

10

실제로 대리자 패턴이 여기에 가장 적합하지 않을 수 있습니다.

나는 대신 NSNotificationCenter을 살펴볼 것입니다.

기본 아이디어는 네트워크 연결을하는 싱글 톤이 새로운 데이터를 사용할 수 있다고 알리는 (postNotificationName:object:userInfo:과 같은) 알림을 게시한다는 것입니다. 이 알림 내에서 가져온 데이터를 보유하고있는 사전 객체 (userInfo) 또는 모델의 어떤 부분에 업데이트 된 데이터가 들어 있는지에 대한 정보를 전달할 수 있습니다.

그런 다음 다른보기 컨트롤러는 addObserver:selector:name:object:을 호출하여 이러한 알림을 '관찰'하도록 등록 할 수 있습니다. 일반적으로 말하면, vc가 보일 때 나는 addObserverremoveObserver이 숨겨 지거나 전환 될 때 호출합니다.

행운을 빈다.

0

위임이이 문제의 올바른 해결책으로 보이지 않습니다. 요청하는 View Controller가 객체 (자체)를 제공하도록하고, 완료 통지로 호출 할 선택자를 요청하는 방법에 대해 설명합니다. 물론 다운로드가 완료 될 때까지 해당 객체와 선택기를 저장할 위치가 필요합니다. 바라기를 당신은 이것을위한 객체를 가지고있다.

+1

성공 블록을 사용할 수도 있습니다. – fabb

0

내가 다음과 같은 방법

중 하나를 사용하는 것이 좋습니다

관찰자 : 다른 객체를 통보 할 사용 데이터가 예를 ones.for 원시에 가까운 있습니다

것은 당신이 당신을 '있는 NSMutableArray'를 사용하는 재사용하지 않습니다 당신이 당신 자신에 대해 하나를 구현해야 적어도 표준 구현 패턴에 의해 객체의 하나의 변화를 알릴 수없는 많은

알림

목적지 개체 (사용자에게 알릴 정보가 있어야 함)와의 상호 작용이 한 번에 이루어지면 다시 알려주지 않거나 다른 데이터가 필요하지 않음을 의미합니다.

각 시간 단계에 알리는 하나의 객체가 대표. 참고

: 성공을위한 블록 사용과 실패는 그들이 마무리 또는 네트워크 작업처럼 실패 할 때 모를 때 작업을 대기 위해에 대한 데이터를 방송하는 패턴이 아닌

편집 : how to create notification | multi delegate issues and implementation

0

여기서 대부분의 답변에 동의하지만 여러 대리자를 실제로 구현하려는 경우 잠재적으로 대리인 배열을 선언하고 해당 배열 내의 모든 대리자에게 메시지를 보낼 수 있습니다. 프로토콜에 선택적 대리자 메서드가있는 경우 호출하기 전에 responds(to aSelector: Selector!) -> Bool을 사용하여 안전하게 확인합니다 (메모리 관리를 염두에두면 해당 대리자는 배열에서 강력하게 참조됩니다). 다시 한 번 말하지만 여러 대의원이 나쁜 아키텍처 아이디어를 사용하고 블록이나 알림 센터를 사용하면 사용자의 요구 사항을 더 잘 충족시킬 수 있습니다.