结合 subscribe(on:options:) 操作符

问题描述

我有一个关于 subscribe(on:options:) 运算符的问题。如果有人能帮我弄清楚,我将不胜感激。

我们从文档中得到了什么:

指定要在其上执行订阅、取消和请求操作的调度程序。 与影响下游消息的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 发布者时也会发生同样的事情。

如果我交换 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,{{1 }} -> URLSession.DataTaskPublisher),这对我来说没有意义,因为在这种情况下我们为什么需要这个 Some of Background

你能帮我理解我错过了什么吗?提前致谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)