Я использую многоадресное делегирование в моем проекте, и я хотел бы интегрировать его с тайфун, поскольку он использует стандартные индивидуальные делегаты-объективы-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;
В моем случае это не работает. Контроллер просмотра создается только при необходимости (TyphoonScopeObjectGraph), но контроллер создается при запуске приложения (TyphoonSingletonScope). Когда приложение создает контроллер представления перед представлением (т. Е. [[TyphoonComponentFactory defaultFactory] componentForKey: @ "aViewController]], новый объект не вводится в делегат многоадресной передачи (addDelegate: не вызывается). Как мне с этим справиться? Я использую DI неправильно? – squikend
Вы не должны использовать defaultFactory.componentForKey, но: https://github.com/typhoon-framework/Typhoon/wiki/Obtaining-Built-Components#proceeding-from-one-object-graph-to-another –
Что касается областей , да, если ваши ViewControllers не являются одиночными, тогда вам нужно будет зарегистрировать их с Mutlicast при создании и отсоединить до уничтожения. –