Combine 系列
- Swift Combine 从入门到精通一
- Swift Combine 发布者订阅者操作者 从入门到精通二
- Swift Combine 管道 从入门到精通三
- Swift Combine 发布者publisher的生命周期 从入门到精通四
- Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五
1. 订阅者Subscriber
虽然 Subscriber 是用于接收整个管道数据的协议,但通常 the subscriber 指的是管道的末端。
Combine 中有两个内建的订阅者: Assign 和 Sink。 SwiftUI 中有一个订阅者: onReceive。
订阅者支持取消操作,取消时将终止订阅关系以及所有流完成之前,由发布者发送的数据。 Assign
和 Sink
都遵循 Cancellable 协议.
当你存储和自己订阅者的引用以便稍后清理时,你通常希望引用销毁时能自己取消订阅。 AnyCancellable 提供类型擦除的引用,可以将任何订阅者转换为 AnyCancellable
类型,允许在该引用上使用 .cancel()
,但无法访问订阅者本身(对于实例来说可以,但是需要更多数据)。 存储对订阅者的引用非常重要,因为当引用被释放销毁时,它将隐含地取消其操作。
Assign 将从发布者传下来的值应用到由 keypath 定义的对象, keypath 在创建管道时被设置。 一个在 Swift 中的例子:
.assign(to: \.isEnabled, on: signupButton)
Sink 接受一个闭包,该闭包接收从发布者发送的任何结果值。 这允许开发人员使用自己的代码终止管道。 此订阅者在编写单元测试以验证发布者或管道时也非常有帮助。 一个在 Swift 中的例子:
.sink { receivedValue in
print("The end result was \(String(describing: receivedValue))")
}
其他订阅者是其他 Apple 框架的一部分。 例如,SwiftUI 中的几乎每个 control
都可以充当订阅者。 SwiftUI 中的 View 协议 定义了一个 .onReceive(publisher)
函数,可以把视图当作订阅者使用。 onReceive
函数接受一个类似于 sink
接受的闭包,可以操纵 SwiftUI 中的 @State
或 @Bindings
。
一个在 SwiftUI 中的例子:
struct MyView : View {
@State private var currentStatusValue = "ok"
var body: some View {
Text("Current status: \(currentStatusValue)")
.onReceive(MyPublisher.currentStatusPublisher) { newStatus in
self.currentStatusValue = newStatus
}
}
}
对于任何类型的 UI 对象 (UIKit、AppKit 或者 SwiftUI), Assign 可以在管道中使用来更新其属性。
参考
https://heckj.github.io/swiftui-notes/index_zh-CN.html
代码
https://github.com/heckj/swiftui-notes