【发布时间】:2019-06-20 00:56:43
【问题描述】:
我正在尝试使用.receive(on: DispatchQueue.main) 更改为下游的主线程,但是在使用.subscribe(:) 或.sink(receiveValue:) 时我没有收到输入。如果我不更改线程,我会收到正确的输入。
出版商
extension URLSessionWebSocketTask {
struct ReceivePublisher: Publisher {
typealias Output = Message
typealias Failure = Error
let task: URLSessionWebSocketTask
func receive<S>(subscriber: S) where S: Subscriber, Output == S.Input, Failure == S.Failure {
task.receive { result in
switch result {
case .success(let message): _ = subscriber.receive(message)
case .failure(let error): subscriber.receive(completion: .failure(error))
}
}
}
}
}
extension URLSessionWebSocketTask {
func receivePublisher() -> ReceivePublisher {
ReceivePublisher(task: self)
}
}
订阅者
extension ViewModel: Subscriber {
typealias Input = URLSessionWebSocketTask.Message
typealias Failure = Error
func receive(subscription: Subscription) {}
func receive(_ input: URLSessionWebSocketTask.Message) -> Subscribers.Demand {
// Handle input here.
// When using `.receive(on:)` this method is not called when should be.
return .unlimited
}
func receive(completion: Subscribers.Completion<Error>) {}
}
订阅
socketTask.receivePublisher()
.receive(on: DispatchQueue.main)
.subscribe(viewModel)
socketTask.resume()
【问题讨论】:
-
放一些示例代码,以便有人可以帮助您。
-
尝试更详细地描述您想要实现的目标以及您面临的问题
-
谢谢,但问题不在于如何做,而在于为什么在使用它时取消下游。换句话说,这个问题的答案现在可以在 beta 2 中使用,而在这里我认为这是给定的。
-
你保存可取消的吗?如果您返回
AnyCancellable并且不保存它,那么它将被取消初始化并且订阅将被取消。