Combine 系列
- Swift Combine 从入门到精通一
- Swift Combine 发布者订阅者操作者 从入门到精通二
- Swift Combine 管道 从入门到精通三
- Swift Combine 发布者publisher的生命周期 从入门到精通四
- Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五
- Swift Combine 订阅者Subscriber的生命周期 从入门到精通六
- Swift 使用 Combine 进行开发 从入门到精通七
1. 管道和线程
Combine 不是一个单线程的结构。 操作符和发布者可以在不同的调度队列或 runloops 中运行。 构建的管道可以在单个队列中,也可以跨多个队列或线程传输数据。
Combine 允许发布者指定线程调度器,不论是从上游的发布者(操作符)接收数据或者向下游的订阅者发送数据,都使用它调度到指定线程。 在与更新 UI 元素的订阅者配合使用时,这一点至关重要,因为更新 UI 始终应该在主线程上。
例如,你可能在代码中看到这样的操作符:
.receive(on: RunLoop.main)
许多操作符可以修改用于进行相关处理的线程或队列。 receive 和 subscribe 是最常见的两个,它们分别负责把调用操作符之后和之前的执行代码调度到对应的线程。
许多其他操作符的参数也包括调度器。 例如 delay, debounce, 和 throttle. 这些也会对执行代码的队列产生影响 - 无论是对自己,还是对于后续在管道中执行的任何操作符。 这些操作符都使用 scheduler
参数,来切换到相应的线程或队列以完成工作。 任何后面连接着他们的操作符也会在其调度器上被调用,从而产生一些影响,如 receive。
2. 把 Combine 运用到你的开发中
通常有两种途径使用 Combine 来进行开发:
-
首先,简单的使用是把你闭包中的同步调用改成一个操作符。 最普遍的两个操作符是 map 和 tryMap,后者是当你的代码需要抛出错误时使用。
-
第二是集成你自己的代码,即提供完成回调的异步代码或 API。 如果你集成的代码是异步的,则大概无法在闭合内轻松地使用它。 你需要将异步代码包装成一个 Combine 操作符可以配合和调用的结构。 在实践中,这通常意味着需要创建一个发布者的实例,然后在管道中使用它。
Future 发布者是专门用来支持这类集成的, 在模式 用 Future 来封装异步请求以创建一次性的发布者 中有一个这样的示例。
如果你想使用发布者提供的数据作为创建此发布者的参数或输入,则有两种通用的方法可以这么做:
-
使用 flatMap 操作符, 使用传入的数据创建或返回发布者实例。 这是模式 使用 flatMap 和 catch 在不取消管道的情况下处理错误 的一种变体。
-
或者,map 或 tryMap 可被用做创建发布者实例,紧跟 switchToLatest 链将该发布者解析为将在管道内传递的值。
级联多个 UI 更新,包括网络请求 和 通过用户输入更新声明式 UI 模式说明了这种使用方法。
你可能会发现创建返回发布者的对象是值得的。 这通常使你的代码能够封装与远程或基于网络的 API 通信的详细信息。 可以使用 URLSession.dataTaskPublisher 或你自己的代码进行开发。 在模式 级联多个 UI 更新,包括网络请求 中详细介绍了这方面的一个简单的示例。
参考
https://heckj.github.io/swiftui-notes/index_zh-CN.html
代码
https://github.com/heckj/swiftui-notes