Subject 也是 Combine 框架中的一个协议,它为我们提供了从外界发送数据的方式。
public protocol Subject : AnyObject, Publisher {
func send(_ value: Self.Output)
func send(completion: Subscribers.Completion<Self.Failure>)
func send(subscription: Subscription)
}
外界每次调用 send(_:)
或者 send(completion:)
,对应的 Subject
就会向外发布一个事件
框架里也预先定义了两种最常用的 Subject
,它们分别是 PassthroughSubject
及 CurrentValueSubject
。
PassthroughSubject
简单地将 send 输入的内容如实反馈,
CurrentValueSubject
则保留一个最后的值,并在被订阅时将这个值作为事件发送。
时序
Subject 严格遵守时序的特性,让我们有机会同时验证那些对时序敏感的多个 Publisher 的组合。
merge
按照时序合并两个或多个publisher
let subject_example1 = PassthroughSubject<Int, Never>()
let subject_example2 = PassthroughSubject<Int, Never>()
check("Subject Order") {
subject_example1.merge(with: subject_example2)
}
subject_example1.send(10)
subject_example2.send(20)
subject_example2.send(21)
subject_example1.send(14)
subject_example1.send(16)
subject_example2.send(25)
// ----- Subject Order -----
// receive subscription: (Merge)
// request unlimited
// receive value: (10)
// receive value: (20)
// receive value: (21)
// receive value: (14)
// receive value: (16)
// receive value: (25)
// receive cancel
zip (当...且...)
把两个 (或多个) Publisher 事件序列中在同一 index 位置上的值进行合并。
当 Publisher1 发布值,且 Publisher2 发布值时,将两个值合并,作为新的事件发布出去。
let subject1 = PassthroughSubject<Int, Never>()
let subject2 = PassthroughSubject<String, Never>()
check("Zip") {
subject1.zip(subject2)
}
subject1.send(1)
subject2.send("A")
subject1.send(2)
// 输出:
// ----- Zip -----
// receive subscription: (Zip)
// request unlimited
// receive value: ((1, "A"))
combineLatest (当...或...)
当 Publisher1 发布值,或者 Publisher2 发布值时,将两个值合并,作为新的事件发布出去。
let subject1 = PassthroughSubject<Int, Never>()
let subject2 = PassthroughSubject<String, Never>()
check("CombineLatest") {
subject1.combineLatest(subject2)
}
subject1.send(1)
subject2.send("A")
subject1.send(2)
// 输出:
// ----- Zip -----
// receive subscription: (Zip)
// request unlimited
// receive value: ((1, "A"))
// receive value: ((2, "A"))
网友评论