【发布时间】:2021-04-27 06:24:06
【问题描述】:
我对@987654321@ 运算符有疑问。如果有人能帮我弄清楚,我将不胜感激。
所以我们从文档中得到了什么:
指定执行订阅、取消和请求操作的调度程序。 与影响下游消息的receive(on:options:)相比,subscribe(on:options:)改变了上游消息的执行上下文。
另外,我从不同的文章中得到的是,除非我们明确指定Scheduler 来接收我们的下游消息(使用receive(on:options:)),否则消息将在用于接收订阅的Scheduler 上发送。
此信息与我在执行期间实际获得的信息不一致。
我有下一个代码:
Just("Some text")
.map { _ in
print("Map: \(Thread.isMainThread)")
}
.subscribe(on: DispatchQueue.global())
.sink { _ in
print("Sink: \(Thread.isMainThread)")
}
.store(in: &subscriptions)
我期待下一个输出:
Map: false
Sink: false
但我得到的是:
Map: true
Sink: false
当我使用Sequence publisher 时也会发生同样的事情。
如果我交换map 运算符和subscribe 运算符的位置,我会收到我想要的:
Just("Some text")
.subscribe(on: DispatchQueue.global())
.map { _ in
print("Map: \(Thread.isMainThread)")
}
.sink { _ in
print("Sink: \(Thread.isMainThread)")
}
.store(in: &subscriptions)
输出:
Map: false
Sink: false
有趣的事实是,当我使用与我的自定义发布者的第一个列表相同的运算符顺序时,我收到了我想要的行为:
struct TestJust<Output>: Publisher {
typealias Failure = Never
private let value: Output
init(_ output: Output) {
self.value = output
}
func receive<S>(subscriber: S) where S : Subscriber, Failure == S.Failure, Output == S.Input {
subscriber.receive(subscription: Subscriptions.empty)
_ = subscriber.receive(value)
subscriber.receive(completion: .finished)
}
}
TestJust("Some text")
.map { _ in
print("Map: \(Thread.isMainThread)")
}
.subscribe(on: DispatchQueue.global())
.sink { _ in
print("Sink: \(Thread.isMainThread)")
}
.store(in: &subscriptions)
输出:
Map: false
Sink: false
所以我认为要么是我对所有这些机制完全误解,要么是某些发布者故意选择线程来发布值(Just,Sequence -> Main,URLSession.DataTaskPublisher -> Some of Background) ,这对我来说没有意义,因为在这种情况下我们为什么需要这个subscribe(on:options:)。
你能帮我理解我错过了什么吗?提前谢谢你。
【问题讨论】: