Yui:使用 Coordinator,避免引用循环。
Coordinator 模式是一种通过将导航逻辑提取到独立对象中,从而提高 View Controller 可重用性的优秀方式。要了解更多关于这个概念,你应该阅读 KHANLOU 的精彩博客上的这篇文章。
但是,如果实现不当,Coordinator 可能会导致由于僵尸 Coordinator 和 View Controller 而引起的巨大内存泄漏。
基于协议的 Coordinator
Yui 的主要协议:`Coordinator`。假设您将希望每个 Coordinator 都在一个树形结构中嵌入多个子 Coordinator。这就是为什么您需要提供一个 `Coordinator` 数组的原因。
Yui 定义了几个扩展作为其协议的默认实现,这使得操作子 Coordinator 变得很容易。如果按照预期使用,Yui 将防止 Coordinator 泄漏。
当释放 View Controller 时,其 `Coordinator` 将通过告诉其父 Coordinator(如果有)从 `Coordinator` 树中删除自身来自动销毁。
这种灵活的架构使您能够在其应用程序中实现任何类型的导航(`UINavigationController`、`UITabBarController`、嵌入的 View Controller...)。
安装
CocoaPods
要使用 CocoaPods 将 Yui 集成到 Xcode 项目中,请在您的 `Podfile` 中指定它
pod 'Yui', '~> 0.1.0'
然后,运行以下命令:
pod install
Carthage
要使用Carthage将Yui集成到Xcode项目中,请在您的Cartfile
中指定它
github "CallMeSH/Yui" ~> 0.1.0
运行carthage update
来构建框架,并将构建好的Yui.framework
拖拽到Xcode项目中。
使用Yui实现协调器
使用Yui就像遵守Coordinator
协议一样简单。
协议要求您创建此方法
start(animated:Bool)
当控制器需要显示时会被调用的方法。为了内存安全的原因,您通常会在这个方法中创建控制器,并在将其交给UIKit(例如,在一个导航控制器上push或者将作为子视图控制器添加)后仅保留一个弱引用。
以及这些属性
completionDelegate
一个弱变量,用于通知父协调器您想要它自我销毁。默认的Coordinator
实现负责设置委托。
childCoordinators
一个要保留在内存中的协调器数组。
viewController
一个属性,当存在时返回协调器管理的视图控制器。
Yui 尽量减少在使用您项目时的影响,为此,它自带一个协议。如果您认为每个步骤的设置太繁琐,我们建议您创建一个根类,该类将实现分配代理和子协调器数组。
使用示例
示例项目中包含在项目demo目录下的Example
。它实现了基于标签栏和导航控制器的应用程序架构。这将为您下一个项目提供灵感。
贡献
Yui的源代码相对简单,目前使用Objective-C运行时,因为Swift没有生存期概念(链接到Rust文档)。我们始终在寻找更好的做事方式。如果您认为可以带来一些改进以使库变得更好,我们将很高兴审阅您的拉取请求或变更请求!
进行中
- 添加单元测试
- 添加集成测试
- 添加公共类型的自动生成文档