Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS VIPER架构,谁必须实例化整个模块?_Ios_Architecture - Fatal编程技术网

iOS VIPER架构,谁必须实例化整个模块?

iOS VIPER架构,谁必须实例化整个模块?,ios,architecture,Ios,Architecture,考虑到毒蛇的结构 我有两个模块,A和B。第一个模块A,通过presenter,想要执行一个必须在模块B中完成的动作,所以告诉它的线框去做。问题是,谁负责实例化整个模块(视图、交互者、演示者…)。我看到了一些不同方法的例子: 在应用程序的开头创建所有模块 在模块的线框中创建整个模块,因此在本例中,BWireframe Instantite的类方法将所有B模块都实例化 考虑到线框负责布线,它是否也负责创建其模块?我认为模块的入口是线框,因此我同意您的第二种方法 创建模块包括创建其所有对象,在我

考虑到毒蛇的结构

我有两个模块,A和B。第一个模块A,通过presenter,想要执行一个必须在模块B中完成的动作,所以告诉它的线框去做。问题是,谁负责实例化整个模块(视图、交互者、演示者…)。我看到了一些不同方法的例子:

  • 在应用程序的开头创建所有模块
  • 在模块的线框中创建整个模块,因此在本例中,BWireframe Instantite的类方法将所有B模块都实例化

考虑到线框负责布线,它是否也负责创建其模块?

我认为模块的入口是线框,因此我同意您的第二种方法


创建模块包括创建其所有对象,在我看来这是一种浪费。

TL;DR:我建议您使用类似的DI框架,并让它处理实例化

您可能不希望线框实例化VIPER模块(视图、演示器、交互器、数据管理器)中的所有内容的原因是,您将直接创建这些组件的依赖项

依赖性使软件不易更改:如果我们在打开/hats的情况下思考它,线框将通过了解视图和数据管理器而跨越至少两个独立层的边界

这迫使我们将线框视为一个通用的基础结构类:即应用程序最外层的内容

然而,这与线框的另一个(更真实的)职责相矛盾:导航。虽然这仍然是基础结构层,但它确实属于
UIKit
-presentViewController:
等)中

所以,亲爱的,毒蛇的线框做得太多了

唯一明智的做法是将两种责任分开:

  • VIPER类的初始化:您可以引入一个,或者使用设计用于解决此问题的DI工具
  • 执行导航:这在
    线框的权限内
  • 附加注释

    如果您想知道“谁实例化了下一个模块?”,那么,恕我直言,我认为一些
    模块A
    的线框与
    模块B
    的线框对话是不对的,不管

    原因是
    模块A
    现在将依赖于
    模块B
    ,导致紧密耦合:这会破坏模块的用途。有关此主题的更多讨论,请访问=]

    希望这有帮助。

    • 使用此Xcode插件()自动创建和启动VIPER文件

    • 阅读这篇文章,了解更多关于VIPER实例化的高级技巧(以及对上述插件的解释):

    模块初始化代码放在自己的路由器上将消除大量代码重复,特别是对于大型项目。 您需要创建这些扩展一次:

    //ReusableView.swift
    协议可重用视图:类{}
    扩展可重用视图{
    静态变量reuseIdentifier:字符串{
    返回字符串(描述:self)
    }
    }
    //UIViewController.swift
    扩展UIViewController:ReusableView{}
    //斯威夫特
    伸缩板{
    func instantialeviewcontroller()->T其中T:ReusableView{
    将InstanceViewController(标识符为:T.reuseIdentifier)返回为!T
    }
    
    }
    一般来说,我更喜欢线框来创建它的模块,如果我们在开始时创建所有模块,那么如果有很多模块,那么它就没有意义,所以我同意第二种方法更好。谢谢fatuhoku,这非常有启发性。在我的项目中,我有四个模块,对此我有些担心。我的下一步将是使用台风,在下一个版本:)再次感谢你。我第一次从这篇文章中了解了台风。。。。我现在的生活比以前好了1000倍。我欠你一杯啤酒@fatuhoku@SleepsOnNewspapers哈哈。很高兴我能帮上忙=]我只想记下使用台风的费用。我将它集成到我的项目中,我发现将代码重构为单元时它很有用。然而,它也增加了我的编译时间(通过CocoaPods)。我遇到的另一个问题是,当我想用Swift编写一些程序集时,我意识到由于语法问题,Typhone无法通过其协议注入对象。看看协议注入是否是用于实现VIPER的东西,然后这是需要注意的。谢谢Marcelo,我会看看这个,听起来很有趣!最后,我用同样的方法解决了这个问题,我使用了一个名为
    ModuleFactory
    的协议来实例化整个模块。您可以在此处看到一个示例: