我在我的项目中使用多播委托,我想将它与台风整合,因为它使用的是标准的一对一Objective-c代表。
至于多播委托,我正在使用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?我该如何解决这个问题?我认为我应该使用方法注入(对于MulticastDelegate中的addDelegate:方法),但不知道如何做...
修改 只是问问而已。是否可以将当前定义(非单例 - 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订阅者;
答案 0 :(得分:1)
由于您的视图控制器具有以下所需的TyphoonScopeObjectGraph:
不幸的是,使用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];
}
可能有用的功能:
这是Typhoon不做的事情,但它可能是一个有趣的特性:使用参数定义注入回调之前/之后,例如:
[definition invokeBeforeInjection:@selector(registerWithDelegate:)
parameters:^(TyphoonMethod *method)
{
[method injectParameterWith:[self multicastDelegate];
}
顺便说一句,您是否更喜欢手动多播代表而不是Apple的NSNotificationCenter?