Tag: 毒蛇建筑

适用于iOS的高级Viper架构,无保留周期。

如今,大型团队的开发人员花费大量时间使用和维护其代码库,而该体系结构提供了开发周期的所有基本要素。 作为开发人员,设计我们的代码非常重要,这样每一部分都易于识别,具有特定的明显目的,并以逻辑方式与其他部分组合在一起。 在本文中,我将介绍一种方法,该方法如何在我们的iOS项目中准确使用VIPER架构,而又不会使内存堆积如山。 本文不是VIPER体系结构的初学者,而是对于使用过该体系结构且可能难以确定几个内存问题的人员的。 在继续之前,请在GitHub上克隆项目。 在该项目中,有两个视图控制器,它们将非常容易且清晰地演示主要问题。 Home View Controller是主导航控制器和推入Home VC的帐户视图控制器的根视图控制器。 克隆上述存储库后,签出“ Without_VIPER”分支。 该分支显示了此演示项目的主要目标。 一个导航堆栈上有两个屏幕。 按下“帐户”按钮后,“帐户VC”将被推送到导航控制器。 在控制台上,您将看到两个视图控制器均已加载到内存中。 按下导航栏上的后退按钮后,您将看到帐户视图控制器已取消初始化。 因此,这是我们项目的基础。 弹出视图控制器后,应将其取消初始化,并释放内存。 现在,检出同一存储库的“ Basic_VIPER”分支。 现在,两个视图控制器都以以下方式遵循VIPER架构方法。 运行该应用程序后,您会看到在Home VC上所有通信都已完成。 它只是在模拟VIPER体系结构的基本流程。 按下帐户按钮后,帐户VC将被推送到导航控制器,并且将一个全新的对象块添加到内存中。 现在按下后退按钮,您将看到Account VC尚未从内存中取消初始化。 每次您按下Home VC上的“帐户”按钮时,都会不断将大量对象添加到内存中,这些对象将相互保持引用并被保留。 在只有两个视图控制器的此类项目中,如果未在适当的完整项目中处理此内存管理,则您的应用程序可能会遇到许多悬空指针。 我们的任务是删除上述保留周期。 现在,检出同一存储库的“ Advance_VIPER”分支。 我们的主要重点是从项目中删除上述保留周期。 可以有很多方法来执行此操作,但是我将遵循所描述的方法。 我将从我们的P(演示者)那里获得一个V(视图控制器)的弱引用,同样,我将从我们的I(交互器)那里获得一个我们的P(演示者)的弱参考。 演示者的实现将通过以下方式进行。 当取消帐户演示者的初始化时,我们将对交互者的引用设为nil,并且作为演示者,交互者引用很弱,因此将没有任何保留周期。 同样,将为View和Presenter保留周期。 运行项目并弹出Account VC后,您将看到所有对象现在都已从内存中取消初始化,并且内存已释放。 本文没有提出实现VIPER体系结构的正确方法,只是表明在实施VIPER时,iOS开发人员应以他们认为容易的任何方式来注意保留周期。 如果不处理这些保留周期,则您的应用程序将遇到内存问题,因此最好继续删除它们。 如果您找到其他更有趣的方法来达到相同的效果,请分享。 编码愉快!

VIPER体系结构iOS Swift

好的,这是另一篇解释iOS Swift的VIPER架构的文章。 这是什么意思,为什么我们要关心VIPER?它比Clean Swift作为VIP更好和更容易,它们真的彼此不同吗? 本文结尾处的示例项目。 让我们从两者之间的一个小比较开始: VIP和VIPER具有相同的文件结构,即使省略中也没有提到ER,它的确有一个实体“模型”和一个路由器“线框”,那又是什么呢? VIP是一种单向流,它来自: UI->视图->交互器->演示者->返回视图。 VIPER是多向流,来自: UI->视图->演示者->交互器->演示者->返回视图。 那么,为什么我认为VIPER比VIP或Clean Swift更容易维护? 有人认为实体是模块的主要模型,而我个人认为实体是实际模型的字符串表示形式。 实体在Interactor中进行映射,并传递给Presenter进行格式化,因此,应该在模块周围流动的对象是Entity,并且没有ViewModel或实际Model在周围流动。 Interactor知道该实体,并将其传递给Presenter,该Presenter将处理格式并将实体类型作为视图的形式传递给视图。 VIPER非常容易实现单一责任原则。 具有ViewModel + Entity只是违反了DRY和KISS原则。 实体是VIPER元素,不应与模型混淆。 因此,我和我的同事在一个Generator上工作,它将准备好正确处理流,而无需麻烦地创建ViewModels,或者让View处理与交互器的路由或事件,因为viper的格式应为: 视图了解Presenter。 演示者了解View,Interactor和Router。 Interactor知道Presenter和Entity。 这是一个演示项目,它以简单的方式实现VIPER设计模式,从而可以实现可测试性,可维护性和可扩展性。 有些人更喜欢Presenter应该格式化传递给View的数据,我实际上不同意这个概念,因为众所周知,Interactor 操纵 Entity。 Kaakati / CoolBlue-iOS 人们可以在GitHub上构建软件。 超过2千8百万的人使用GitHub来发现,发掘和贡献超过…… github.com 上面的示例是使用生成器构建的,该生成器会将您的文件作为UI组件,作为ViewController的Viewer,演示者,路由器,交互器和实体分为UI。 Kaakati / VIPER模块生成器 VIPER-Module-Generator –具有预定义功能和BaseViewProtocol的VIPER模块样板生成器。 github.com