首页 > 解决方案 > iOS Typhoon DI 框架替换 Objective-c 中的单例

问题描述

我正在使用带有 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 的数据创建一个用户对象,并在视图控制器之间传递它。

辛格尔顿似乎做得很好,很适合我的情况,但我遇到了台风!

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

其次,这是我的实现 - 我有一个看起来像这样的程序集

- (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. 使程序集默认

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

标签: iosobjective-cdependency-injectiontyphoon

解决方案


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

回答:

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

如果您使用 Swift,Fiery Crucible是一个出色的 DI 框架。它具有 Typhoon 的大部分功能,使用简单,并且没有其他一些 Swift 框架的缺点。

要在不同的视图中获得相同的启动类,我似乎需要执行以下操作:

  1. 在程序集中使用 TyphoonScopeSingleton 作为 definition.scope
  2. 使程序集默认

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

回答:

这不是正确的方法。想法是拥有一个Typhoon 实例,在组合根目录下创建,然后它将与您的应用程序一起存在于正在运行的(前台或后台)应用程序的生命周期中。

  • 我们不会向 Typhoon 询问依赖项,而是告诉它将依赖项注入到控制器、服务或其他类中。
  • 唯一的例外是在使用工厂模式时,我们混合了静态依赖项以及运行时参数,例如:“给我这个用​​户的订单视图控制器”。在这种情况下,我们注入程序集本身。

对于 iOS,Typhoon 提供了一种在启动时引导程序集的方法,无论有没有故事板。该示例显示了如何执行此操作,以及有关故事板的本指南

如果您在尝试上述资源后遇到另一个障碍,请提出另一个具体问题。


推荐阅读