2014-10-23 4 views
2

Я использую многоадресное делегирование в моем проекте, и я хотел бы интегрировать его с тайфун, поскольку он использует стандартные индивидуальные делегаты-объективы-c.Многоадресная передача в Typhoon

Что касается многоадресной передачи, я использую подход NSProxy, объясненный здесь: http://arielelkin.github.io/articles/objective-c-multicast-delegate/.

Мой код до сих пор:

-(AViewController*)aViewController{ 
    return [TyphoonDefinition withClass:[AViewController class] configuration:^(TyphoonDefinition 
    *definition) { 
     }]; 
    } 

    -(BViewController*)bViewController{ 
    return [TyphoonDefinition withClass:[BViewController class] configuration:^(TyphoonDefinition 
    *definition) { 
     }]; 
    } 

    -(AppController*)appController{ 
    return [TyphoonDefinition withClass:[AppController class] configuration:^(TyphoonDefinition 
    *definition) { 
    [definition setScope:TyphoonScopeSingleton]; 
    [definition injectProperty:@selector(delegate) with:[self appControllerMulticastDelegate]]; 
     }]; 
    } 

    -(MulticastDelegate*)appControllerMulticastDelegate{ 
    return [TyphoonDefinition withClass:[MulticastDelegate class] 
    configuration:^(TyphoonDefinition *definition) { 
    [definition setScope:TyphoonScopeSingleton]; 
     }]; 
    } 

Можно ли вводить aViewController и bViewController в appControllerMulticastDelegation? Как мне решить эту проблему? Я думаю, что я должен использовать инъекции метода (для addDelegate: метод в MulticastDelegate), но понятия не имею, как это сделать ...

EDIT Просто спрашивают. Можно ли придать экземпляр из текущего определения (не-одиночки - TyphoonScopeObjectGraph) к какому-либо другому определению, что-то вроде этого (инъекций метода):

-(AViewController*)aViewController{ 
    return [TyphoonDefinition withClass:[AViewController class] configuration:^(TyphoonDefinition 
    *definition) { 
    [(TyphoonDefinition*)[self appContollerMulticastDelegate] injectMethod:@selector(addDelegate:) 
      parameters:^(TyphoonMethod *method) { 
      [method injectParameterWith:/*instance of AViewController that will be created*/]; 
     }]; 
} 

На время выполнения: AViewController * aViewController = [(MyAssembly *) factory aViewController]; // создает новый уникальный экземпляр AViewController и добавляет его к подписчикам appContollerMulticastDelegate;

ответ

1

Поскольку контроллеры зрения имеют TyphoonScopeObjectGraph его необходимо:

  • Регистрация с делегатом Multicast по созданию
  • Detach перед разрушением.

К сожалению, на самом деле это невозможно связать с использованием Typhoon, поэтому вам нужно просто сделать это в своем контроллере.

Регистрация часть может быть сделано:

Добавить методы категории:

- (void)registerWithDelegate 
{ 
    self.delegate addSubscriber:self]; 
} 

Тогда при регистрации контроллер представления:

- (BViewController *)bViewController 
{ 
    return [TyphoonDefinition withClass:[BViewController class] 
     configuration:^(TyphoonDefinition *definition) 
    { 
     [definition injectProperty:@selector(delegate) with:[self appControllerMulticastDelegate]]; 
     definition.beforeInjections = @selector(registerWithDelegate); 
    }]; 
} 

Но, к сожалению, у Typhoon нет никаких крючков в dealloc компонента.

Вместо просто:

- (void)dealloc 
{ 
    [_delegate removeSubscruber:self]; 
} 


Возможная полезная особенность:

Вот то, что тайфун не делает, но это было бы потенциально интересная особенность: определение до/после инъекционных обратных вызовов с аргументами, такими как:

[definition invokeBeforeInjection:@selector(registerWithDelegate:) 
    parameters:^(TyphoonMethod *method) 
{ 
    [method injectParameterWith:[self multicastDelegate]; 
} 


Кстати, есть причина, вы предпочитаете многоадресные делегат вручную перевернулся NSNotificationCenter Apple?

+0

В моем случае это не работает. Контроллер просмотра создается только при необходимости (TyphoonScopeObjectGraph), но контроллер создается при запуске приложения (TyphoonSingletonScope). Когда приложение создает контроллер представления перед представлением (т. Е. [[TyphoonComponentFactory defaultFactory] componentForKey: @ "aViewController]], новый объект не вводится в делегат многоадресной передачи (addDelegate: не вызывается). Как мне с этим справиться? Я использую DI неправильно? – squikend

+0

Вы не должны использовать defaultFactory.componentForKey, но: https://github.com/typhoon-framework/Typhoon/wiki/Obtaining-Built-Components#proceeding-from-one-object-graph-to-another –

+0

Что касается областей , да, если ваши ViewControllers не являются одиночными, тогда вам нужно будет зарегистрировать их с Mutlicast при создании и отсоединить до уничтожения. –

Смежные вопросы