Combine 系列
- Swift Combine 从入门到精通一
- Swift Combine 发布者订阅者操作者 从入门到精通二
- Swift Combine 管道 从入门到精通三
- Swift Combine 发布者publisher的生命周期 从入门到精通四
1. 操作符 operations
操作符是 Apple 参考文档中发布者下包含的一些预构建函数的便捷名称。 操作符用来组合成管道。 许多操作符会接受开发人员的一个或多个闭包,以定义业务逻辑,同时保持并持有发布者/订阅者的生命周期。
一些操作符支持合并来自不同管道的输出、更改数据的时序或过滤所提供的数据。 操作符可能还会对操作类型有限制, 还可用于定义错误处理和重试逻辑、缓冲和预先载入以及支持调试。
1.1 Mapping elements
- scan
- tryScan
- setFailureType
- map
- tryMap
- flatMap
1.2 Filtering elements
- compactMap
- tryCompactMap
- replaceEmpty
- filter
- tryFilter
- replaceError
- removeDuplicates
- tryRemoveDuplicates
1.3 Reducing elements
- collect
- reduce
- tryReduce
- ignoreOutput
1.4 Mathematic operations on elements
- max
- tryMax
- count
- min
- tryMin
1.5 Applying matching criteria to elements
- allSatisfy
- tryAllSatisfy
- contains
- containsWhere
- tryContainsWhere
1.6 Applying sequence operations to elements
- firstWhere
- tryFirstWhere
- first
- lastWhere
- tryLastWhere
- last
- dropWhile
- tryDropWhile
- dropUntilOutput
- prepend
- drop
- prefixUntilOutput
- prefixWhile
- tryPrefixWhile
- output
1.7 Combining elements from multiple publishers
1.8 Handling errors
- catch
- tryCatch
- assertNoFailure
- retry
- mapError
1.9 Adapting publisher types
- switchToLatest
- eraseToAnyPublisher
1.10 Controlling timing
- debounce
- delay
- measureInterval
- throttle
- timeout
1.11 Encoding and decoding
1.12 Working with multiple subscribers
1.13 Debugging
- breakpoint
- handleEvents
- print
2. Subjects
Subjects 是一种遵循 Subject 协议的特殊的发布者。 这个协议要求 subjects 有一个 .send(_:)
方法,来允许开发者发送特定的值给订阅者或管道。
Subjects 可以通过调用 .send(_:)
方法来将值“注入”到流中, 这对于将现有的命令式的代码与 Combine 集成非常有用。
一个 subject 还可以向多个订阅者广播消息。 如果多个订阅者连接到一个 subject,它将在调用 send(_ 时向多个订阅者发送值。 一个 subject 还经常用于连接或串联多个管道,特别是同时给多个管道发送值时。
Subject 不会盲目地传递其订阅者的需求。 相反,它为需求提供了一个聚合点。 在没有收到订阅消息之前,一个 subject 不会向其连接的发布者发出需求信号。 当它收到订阅者的需求时,它会向它连接的发布者发出 unlimited
需求信号。 虽然 subject 支持多个订阅者,但任何未请求数据的订阅者,在请求之前均不会给它们提供数据。
Combine 中有两种内建的 subject : CurrentValueSubject 和 PassthroughSubject。 它们的行为类似,但不同的是 CurrentValueSubject
需要一个初始值并记住它当前的值,PassthroughSubject
则不会。 当调用 .send()
时,两者都将向它们的订阅者提供更新的值。
在给遵循 ObservableObject 协议的对象创建发布者时,CurrentValueSubject
和 PassthroughSubject
也很有用。 SwiftUI 中的多个声明式组件都遵循这个协议。
参考
https://heckj.github.io/swiftui-notes/index_zh-CN.html
代码
https://github.com/heckj/swiftui-notes