MiniRex
一套类似于响应式的实用工具集合,帮助用 Swift 建造更优秀的 Apple 平台应用。
目前提供了一个简化版的 Swift 发布/订阅 API,进一步开发将基于需求和情况而定。
兼容性
MiniRex 目前正在 Xcode 10.2 上进行开发,使用了 Apple 最新的 SDK 和 Swift 5。
它在最新版本的 macOS 10.14 和 iOS 12 上已使用并测试,但应该可以在任何其他基于 Foundation 的 Apple 平台 SDK 上正常运行,无需任何修改。它也正在至少一个支持 macOS 10.11 及以上版本的 mac App Store 上线产品中部署。
它也应在任何支持 Swift 部署的较老 Apple OS(目前 macOS 10.9+ 和 iOS 7+)上基本无需修改即可运行。
安装
Carthage 是在现有项目中集成 MiniRex 的推荐方式。如果与项目的 github URL 配置正确,它运行良好。
或者如果您愿意,也可以通过 CocoaPods 来获取。Pod 名称是“MiniRex”
也可以在最适合您项目设置的时候克隆仓库,无论是作为子模块还是作为同级仓库。
设置
MiniRex仅依赖于Foundation和Swift标准库,因此您可以将框架直接添加到项目中。您需要执行以下步骤
- 将MiniRex项目添加到您的工作区或项目。
- 将MiniRex作为依赖项添加到将使用它的目标。
- 在应用构建过程中添加一个复制阶段,将框架复制到应用框架文件夹。
如何使用
整个API基于Publisher模板协议,该协议只有一个方法,该方法接受一个回调,该回调以Publisher.Update类型作为参数被调用,并返回一个Subscription对象。
Subscription对象用于管理订阅的生命周期。它们在被销毁或其invalidate()方法被调用时结束订阅。
一些基本的使用规则
- 发布者不应在对象图中拥有任何内容。提供它们那些类型将负责在其应该保持存活的任何时候维护已发布的源。
- 发布者还应防止其源被销毁或者不再产生值。在这种情况下,它们将停止发布更新。
- 除非发布者明确说明或使用分发适配器(见下文),否则无法保证向订阅者的更新发送是同步的还是异步的。如果有疑问,请使用Publisher分发适配器以使其行为符合期望。
- 除非有其他文档说明或使用分发适配器(见下文),否则也无法保证更新将在哪个队列中发生。
- 所有在subscribe调用上传递的update块都可以假定会逃逸,因此只要返回的Subscription对象存活,它们就会继续存在。换句话说,请小心您在其中放置的强引用。
- 目前有三种类型的发布者,根据它们的行为不同。它们都实现了Publisher协议,但具有自己独特的语义、初始化器和工具。任何提及以下术语的文档都假设描述的行为将适用于它们。以下是它们的类型
- 广播器:类型为
Broadcaster<Update>
,不保证何时调用更新。示例包括通知发布者、事件发布者或以重复计时器更新订阅者的发布者。示例包括通知广播适配器和SimpleBroadcaster<Update>
类型。 - 发布值:类型为
Published<Value>
,提供特定类型的值。订阅它们将始终触发一个初始更新回调,该回调以订阅时当前值作为参数(此调用不必是同步的,尽管可以是)。进一步的更新调用将在发布值更改时发生。Equatable
值仅在它们的值更改时更新订阅者,非equatable引用类型在其身份更改时更新。示例包括包含初始KVO观察选项的KVO发布者和PublishedProperty类的publishedValue
属性。 - 任务:这些模型异步转换。它们可以选择发布任务进度的更新,但一旦发布了一个带有错误或任务结果的更新,则保证不会发布任何进一步的更新。
- 广播器:类型为
还包括一些预构建的实用工具,以便于采用
- 转换发布器适配器。对于
Published<Value>
的适配器将在可能的情况下保留相等/身份语义。对于Broadcaster<Update>
的适配器将仅发布转换后的更新值。 - 基于
NotificationCenter
的Broadcaster
,可以将传统 Foundation 通知轻松转换为 MiniRex API。 - 基于 KVO 的发布器(包括预构建的
Published<Value>
类型),将 KVO 观察轻松转换为 MiniRex API。 - 一个常数
Published<Value>
,它只向新的订阅者发送不可变值。对于测试目的和发布值销售协议的存根实现非常有用。 - 一个基本的
PublishedProperty
类,可以用来自定义一个可销售属性和一个在变化时更新其订阅者的Published<Value>
。发布/订阅的语义隐含着引用,并且除了订阅/取消订阅的操作外,还需要修改最终发布者源,因此必须是一个类而不是一个结构体。 - 调度适配器,适用于所有类型的发布器,包括订阅和更新回调。它们使构建在特定队列上执行其工作组件变得容易,连接其他在不同调度队列上执行的工作。
- 用于 URL 数据下载和文件读取的任务。向其中之一提供 URL,然后订阅返回的任务以启动下载/文件读取。
贡献建议
虽然这个框架不是基于特别革命性的想法,但我希望它对广泛的开发人员有用。如果您认为某个特定的改进可以使它更有用,请告诉我。
待办事项
- 任务测试覆盖率。
发布历史
- 2.0.0 (20190602):新的 API,对
Broadcaster<Update>
和Published<Value>
的全面单元测试覆盖。 - 1.0.5 (20190417):修复 SimpleBroadcaster(不能从库外初始化)。添加了几个缺失的单元测试。
- 1.0.4 (20190415):支持 CocoaPods。
- 1.0.3 (20190411):修复 URL 数据任务取消流程。
- 1.0.2 (20190411):修复任务并添加 URL 数据任务(满足您携带回家的面试软件项目需求)。
- 1.0.1 (20190409):通用任务发布者和单个更新订阅的初始实现。
- 1.0.0 (20190407):在整个项目中采用发布者行为的命名约定(广播器/发布值/任务)。类型重命名意味着此版本与前版本不兼容,但更新应该足够简单。
- 0.2.3 (20190221):修复了与可空属性KVO发布值相关的崩溃问题。
- 0.2.2 (20190212):对 Equatable 和引用类型实现高效的发布值行为。
- 0.2.1 (20190212):添加了发布值转换器实用工具。
- 0.2.0 (20190211):添加了 Carthage 支持
- 0.1.0 (20181028):第一个API版本。
许可证
版权所有 2018-2019 Óscar Morales Vivó
根据MIT许可证授权:https://open-source.org.cn/licenses/mit-license.php