4

ストーリーボードの最初のコントローラーをインスタンス化するために使用される plist の初期アセンブリを構成しています。

アプリの後半で、次を使用してルート ビュー コントローラーを変更しています。

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

新しいビュー コントローラーをインスタンス化するときに、同じアセンブリを使用したいと考えています。その理由は、シングルトンをシングルトンのままにしたいからです。アセンブリ/ファクトリが変更されると、シングルトンを含むすべてのクラスが再度作成されます。

ストーリーボードの最初のView Controllerを初期化するためにファクトリを使用するにはどうすればよいですか?

4

1 に答える 1

4

緊密なストーリーボード統合:

通常のandとともにplist 統合が使用されている限り、Typhoon はすべての Storyboard が TyphoonStoryboard であることを保証します。通常のストーリーボードとまったく同じように使用し、依存関係が TyphoonAssembly クラスの定義に従って注入されるという追加の利点があります。UILaunchStoryboardNameUIMainStoryboardFile

TyphoonComponentFactory はストーリーボードによって保持されるため、アプリのライフサイクル全体を通じて保持されます。


ストーリーボード以外: (つまり、MacOS アプリ、ユーティリティなど)

TyphoonComopnentFactory は実際、アプリのライフサイクル全体を通じて保持されるように設計されています。(ただし、必要に応じて他のことを行うこともできます)。

キーコンセプト:

  • をそのままお使いいただけますTyphoonComponentFactory
  • また、どのアセンブリ インターフェイスも TyphoonComponentFactory の前に配置できます。ビルド時に、アセンブリは定義を返します。実行時に、ビルドされたコンポーネントを返します

あるオブジェクトグラフから別のオブジェクトグラフに進むときに TyphoonComponentFactory を保持する方法は 2 つあります。このコンポーネントの作成を「台風対応」と呼びます。


アプローチ 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 対応' にするもう 1 つの方法は、Typhoon のコールバック フックを使用することです。NSObject カテゴリ メソッドをオーバーライドすることにより :

typhoonSetFactory:(id)thefactory

上記の他のアプローチと同様に、ファクトリはTyphoonComponentFactoryアセンブリ インターフェイスとして使用することができます。

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

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

2 つの方法のうち、最も適した方法を使用してください。前者をお勧めします。これは「非侵襲的」であるため、独自のクラスが Typhoon API を直接呼び出さないことを意味します。Typhoon から移行したい場合は、アセンブリの代替実装を提供するだけです。



あるオブジェクト グラフから別のオブジェクト グラフに進む:

上記の方法のいずれかを使用してコンポーネントが「台風対応」になると、これを使用して、あるオブジェクトグラフから別のオブジェクトグラフに進むことができます。

  • Typhoon のデフォルトのスコープは です。これはTyphoonScopeObjectGraph、デリゲートと循環参照を含むビュー コントローラーをロードできることを意味します。完了すると、メモリから破棄されます。
  • 一方、TyphoonScopeSingleton(またはTyphoonScopeWeakSingleton) のすべてのコンポーネントは保持されます。

この機能の詳細については、こちらのユーザー ガイドを参照してください。


あるストーリー ボードから別のストーリー ボードに進む:

アプリのある時点で新しいストーリーボードをプログラムでインスタンス化するには (ビュー コントローラーなど):

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

. . 上記のアプローチ 1 またはアプローチ 2 を使用してファクトリを取得します。



概要:

  • アセンブリは、通常の Objective-C/Swift メモリ ルールに従います。そのため、少なくとも 1 つのクラスで使用されている限り、存続し続けます。上記の「あるオブジェクト グラフから別のオブジェクト グラフに進む」プロセスを使用することは、アプリのライフサイクル全体を通じて持続することを意味します。
于 2014-10-22T01:27:59.677 に答える