在 Combine 中将 Publisher 的错误类型转换为 Never
Converting Publisher's error type to Never in Combine
我有一个发布者
var subject = PassthroughSubject<Int, Error>()
我想将其转换为
PassthroughSubject<Int, Never>
有没有办法实现这个?
编辑 - 更多详细信息
我不希望 Publisher 完成并且链接的答案不起作用,因为 catch 仍然完成了发布者。
下面是使用 catch
将 <Int, Error>
转换为 <Int, Never>
的示例:
import UIKit
import Combine
class ViewController: UIViewController {
let subject = PassthroughSubject<Int, Error>()
var storage = Set<AnyCancellable>()
override func viewDidLoad() {
super.viewDidLoad()
self.subject
.catch { what in
Empty(completeImmediately:false)
}
.sink {print([=10=])}
.store(in: &self.storage)
}
}
如果你现在发送 1
到直通主题,你会得到 1
最后。但是,如果您向直通主题发送错误,则最后没有错误到达;管道端类型为 <Int, Never>
.
但是,请注意,您永远不能发送另一个值。这与管道无关;这是因为一旦您通过 Subject 发送错误,该 Subject 就死了。你对此无能为力。
我有一个发布者
var subject = PassthroughSubject<Int, Error>()
我想将其转换为
PassthroughSubject<Int, Never>
有没有办法实现这个?
编辑 - 更多详细信息
我不希望 Publisher 完成并且链接的答案不起作用,因为 catch 仍然完成了发布者。
下面是使用 catch
将 <Int, Error>
转换为 <Int, Never>
的示例:
import UIKit
import Combine
class ViewController: UIViewController {
let subject = PassthroughSubject<Int, Error>()
var storage = Set<AnyCancellable>()
override func viewDidLoad() {
super.viewDidLoad()
self.subject
.catch { what in
Empty(completeImmediately:false)
}
.sink {print([=10=])}
.store(in: &self.storage)
}
}
如果你现在发送 1
到直通主题,你会得到 1
最后。但是,如果您向直通主题发送错误,则最后没有错误到达;管道端类型为 <Int, Never>
.
但是,请注意,您永远不能发送另一个值。这与管道无关;这是因为一旦您通过 Subject 发送错误,该 Subject 就死了。你对此无能为力。