4

我在 plist 中配置初始程序集,用于实例化情节提要中的第一个控制器。

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

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

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

如何让工厂用于初始化情节提要中的第一个视图控制器?

4

1 回答 1

4

紧密的故事板集成:

只要使用plist 集成以及通常的UILaunchStoryboardNameand UIMainStoryboardFile,Typhoon 将确保任何 Storyboard 都是 TyphoonStoryboard。与普通故事板完全一样使用,另外还有一个好处是依赖项将根据 TyphoonAssembly 类中的定义注入。

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


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

TyphoonComopnentFactory 确实设计为在您的应用程序的整个生命周期中保留。(尽管如果您愿意,您可以做其他事情)。

关键概念:

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

从一个对象图到另一个对象图时,有两种方法可以保留 TyphoonComponentFactory。我们将这种组件的制作称为“台风感知”


方法1:注入程序集:

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

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

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

可以在此处的用户指南中找到有关此功能的更多信息。


方法2:使用回调钩子:

使组件“感知台风”的另一种方法是使用 Typhoon 的回调挂钩。通过覆盖 NSObject 类别方法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将被保留。

有关此功能的更多信息,请参见此处的用户指南


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

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

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

. . 使用上述方法 1 或方法 2 获取工厂。



概括:

  • 该程序集遵循正常的 Objective-C/Swift 内存规则。因此,只要它被至少一个类使用,它就会继续存在。使用上述“从一个对象图到另一个对象图”的过程意味着它将在您的应用程序的整个生命周期中持续存在。
于 2014-10-22T01:27:59.677 回答