2

我在我的项目中使用了多播委托,我想将它与台风集成,因为它使用标准的一对一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?我应该如何解决这个问题?我认为我应该使用方法注入(对于 addDelegate: MulticastDelegate 中的方法),但不知道该怎么做......

编辑 只是问。是否可以将当前定义(非单例 - 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 订阅者;

4

1 回答 1

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?

于 2014-10-23T08:26:42.837 回答