台风 - 在整个应用中使用单组分工厂

时间:2014-10-21 18:18:58

标签: ios xcode ios8 typhoon

我在plist中配置初始程序集,用于实例化故事板中的第一个控制器。

稍后在应用程序中我将使用以下方式更改根视图控制器:

 TyphoonStoryboard* storyboard = [TyphoonStoryboard storyboardWithName:storyboardType factory:factory bundle:nil];
 UIViewController* newRootView = [storyboard instantiateViewControllerWithIdentifier:identifier];
 self.window.rootViewController = newRootView;

我想在实例化新视图控制器时使用相同的程序集。原因是我希望单身人士保持单身人士。如果程序集/工厂更改,则会再次创建所有类,包括单例。

如何让工厂用于初始化故事板中的第一个视图控制器?

1 个答案:

答案 0 :(得分:4)

紧密的故事板集成:

只要使用plist integration,以及通常的UILaunchStoryboardNameUIMainStoryboardFile,Typhoon就会确保任何Storyboard都是TyphoonStoryboard。完全与普通故事板一样使用,并且根据TyphoonAssembly类中的定义注入依赖项的额外好处。

TyphoonComponentFactory将由故事板保留,因此将在您的应用程序的整个生命周期中保留。


故事板之外:(即MacOS应用程序,实用程序等)

TyphoonComopnentFactory确实设计为在应用程序的整个生命周期中保留。 (如果你愿意,你可以做点别的事)。

关键概念:

  • 您可以按原样使用TyphoonComponentFactory
  • 此外,您的任何程序集界面都可以在TyphoonComponentFactory前面构建。在 构建时 ,程序集返回定义。 在运行时,它返回构建的组件

从一个对象图转换到另一个对象图时,有两种方法可以保留TyphoonComponentFactory。我们称之为 制作您的组件' Typhoon aware'


方法1:注入装配体:

- (MyAppDelegate *)appDelegate
{
    return [TyphoonDefinition withClass:[MyAppDelegate class] 
        configuration:^(TyphoonDefinition *definition)
    {
        //Other injections . . . 
        [definition injectProperty:@selector(factory) with:self];
    }];
}

上面的示例将TyphoonComponentFactory注入名为factory的属性中。

  • 注入程序集时,它可以用作TyphoonComponentFactory
  • 它也可以用作任何装配类型。例如,您可以声明类型为components的属性CoreCompopnents并注入程序集。

有关此功能的更多信息,请参阅the User Guide here


方法2:使用回调挂钩:

另一种制造组件的方法'台风意识到'是使用Typhoon的回调钩子。通过覆盖NSObject category method s:

typhoonSetFactory:(id)thefactory

与上面的其他方法一样,工厂可以用作TyphoonComponentFactory或我前面摆出的任何装配接口,以下两种方法都可以:

typohoonSetFactory:(TyphoonComponentFactory*)factory
{
    //Do something with factory
}

typhoonSetFactory:(ApplicationAssembly*)assembly
{
    //Do something with assembly
}

在这两种方法中,使用最适合您的方法。我们推荐前者,因为它是非侵入性的'这意味着您自己的课程不会直接调用任何Typhoon API。如果您希望从Typhoon迁移出去,您只需提供一个替代的程序集实现。



从一个对象图开始到另一个:

一旦某个组成部分出现“台风”问题'使用上述任一方法,我们可以使用它从一个对象图到另一个对象图。

  • Typhoon的默认范围是TyphoonScopeObjectGraph,这意味着您可以加载视图控制器,包括任何委托和循环引用。完成后,它将从内存中丢弃。
  • 同时保留TyphoonScopeSingleton(或TyphoonScopeWeakSingleton)的任何组件。

有关此功能的更多信息,请参见User Guide here


从一个故事板开始到另一个故事板:

以编程方式在应用程序的某个位置实例化新的故事板(例如视图控制器):

UIStoryboard *board = [TyphoonStoryboard storyboardWithName:@"name" 
    factory:factory bundle:[NSBundle mainBundle]];

。 。使用上面的方法1或方法2获得工厂。



<强>要点:

  • 程序集遵循正常的Objective-C / Swift内存规则。因此,只要它被至少一个类使用,它将继续存在。使用从一个对象图到另一个对象图的过程。上面描述的意味着它将在你的应用程序的整个生命周期中持续存在。