Subject
是一种特殊的 Publisher,最大的特点是可以手动发送数据。定义如下:
public protocol Subject : AnyObject, Publisher {
func send(_ value: Self.Output)
func send(completion: Subscribers.Completion<Self.Failure>)
func send(subscription: Subscription)
}
从定义可以看到,Subject 暴露了 3 个 send 方法,调用者可以通过send
方法来手动发布Output
数据以及Completion
事件。
内置Subject
PassthroughSubject
简单地将通过 send 发送数据或事件给下游的 Publisher 或 Subscriber, 并不会对接收到的数据进行保留。
代码语言:javascript复制import Combine
// 1 创建PassthroughSubject
let subject = PassthroughSubject<String, Never>()
// 2 订阅
let subscription = subject.sink(receiveCompletion: { _ in
print("receiveCompletion")
}, receiveValue: { value in
print(value)
})
// 3 发送数据
subject.send("Hello")
subject.send("Combine")
subject.send(completion: .finished)
/* 输出
Hello
Combine
receiveCompletion
*/
CurrentValueSubject
保留一个最后的数据,并在被订阅时将这个数据发送给下游的 Publisher 或 Subscriber。
代码语言:javascript复制import Combine
// 1 创建CurrentValueSubject,需要初始化一个数据
let subject = CurrentValueSubject<String, Never>("Hello")
// CurrentValueSubject有value属性
print(subject.value)
// 2 发送数据
subject.send("Combine")
print(subject.value)
// 3 订阅
let subscription = subject.sink { value in
print(value)
}
/* 输出
Hello
Combine
Combine
*/