台风中的组播代表团

时间:2014-10-23 07:08:05

标签: typhoon

我在我的项目中使用多播委托,我想将它与台风整合,因为它使用的是标准的一对一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订阅者;

1 个答案:

答案 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?