Swift Combine 订阅者Subscriber的生命周期 从入门到精通六

Combine 系列

  1. Swift Combine 从入门到精通一
  2. Swift Combine 发布者订阅者操作者 从入门到精通二
  3. Swift Combine 管道 从入门到精通三
  4. Swift Combine 发布者publisher的生命周期 从入门到精通四
  5. Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五
    在这里插入图片描述

1. 订阅者Subscriber

虽然 Subscriber 是用于接收整个管道数据的协议,但通常 the subscriber 指的是管道的末端。

Combine 中有两个内建的订阅者: Assign 和 Sink。 SwiftUI 中有一个订阅者: onReceive。

订阅者支持取消操作,取消时将终止订阅关系以及所有流完成之前,由发布者发送的数据。 AssignSink 都遵循 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

你可能感兴趣的:(iOS,swift,开发语言,ios,combine,subscriber)