iOS Typhoon DI框架将取代Objective-C中的单例

时间:2019-03-01 18:44:34

标签: ios objective-c dependency-injection typhoon

我正在使用带Firebase身份验证的基于情节提要/ objective-c的iOS应用程序。我使用Cloud Firestore保存用户数据-年龄,性别等。当用户到达应用程序时,我检查用户是否登录了以下(类似)代码

FIRUser *firUser = [FIRAuth auth].currentUser;
if (firUser) {
    // user logged in 
    // fetch updated user date from cloud firestore 
} else {
    // NO logged in user 
}

用户登录后,他们可以导航到应用程序的其他部分,否则他们会看到注册/登录页面。

它的外观导航到不同的视图通常意味着我必须调用上面的代码来再次确定已登录状态-我不想这样做。我想创建一个具有登录用户和来自Firestore的数据的用户对象,并将其在视图控制器之间传递。

Singleton似乎做得很好,并且很适合我的情况,但是我遇到了台风!

第一个问题是,使用该框架还可以吗?似乎有些不活跃,但技术却非常惊人。

第二个是我的实现-我有一个看起来像这样的程序集

- (AuthenticatedUser*)authenticatedUser {
    return [TyphoonDefinition withParent:[self user] class:[AuthenticatedUser class] configuration:^(TyphoonDefinition* definition){

        definition.scope = TyphoonScopeSingleton;
    }];
}

这就是我获取AuthenticatedUser实例的方式

ModelsAssembly *modelsAssembly = [ModelsAssembly defaultAssembly];

// no default ModelsAssembly set
if( modelsAssembly == nil ){
    modelsAssembly = [[ModelsAssembly new] activated];
    [modelsAssembly makeDefault];
}

authenticatedUser = [modelsAssembly authenticatedUser];

要在不同的视图中获取同一启动的类,我需要执行以下操作:

  1. 在装配中将TyphoonScopeSingleton用作definition.scope
  2. 将程序集设为默认

我想知道是否有人可以为此提供一些指导。

1 个答案:

答案 0 :(得分:0)

  

第一个问题是,使用该框架还可以吗?似乎有些不活跃,但是却是非常了不起的技术。

答案:

对于Objective-C,台风仍然是依赖注入库的最佳选择。它功能齐全,因此通常不添加新功能,但是由AppsQuick.ly维护和支持。

如果您使用的是Swift,Fiery Crucible是一个出色的DI框架。它具有Typhoon的大多数功能,易于使用,并且没有其他Swift框架的缺点。

  

要在不同的视图中获取同一启动的类,我需要执行以下操作:

     
      
  1. 使用TyphoonScopeSingleton作为装配体中的definition.scope
  2.   
  3. 将程序集设为默认值
  4.   
     

我想知道是否有人可以为此提供一些指导。

答案:

这不是正确的方法。这个想法是让Typhoon的一个 实例在composition root上创建,然后在运行中的应用程序(前景应用程序或后台应用程序)中与应用程序一起使用。

  • 我们不要求Typhoon提供依赖关系,而是告诉它将依赖关系注入到控制器,服务或其他类中。
  • 唯一的例外是使用factory pattern时,其中混合了静态依赖项和运行时参数,例如:“为该用户提供订单视图控制器”。在这种情况下,我们将注入装配本身。

对于iOS,Typhoon提供了一种在启动时引导程序集的方法,无论有无故事板。 sample以及情节提要板上的this guide显示了如何执行此操作。

如果尝试了上述资源后仍然遇到其他障碍,请询问其他特定问题。