swift - 订阅返回 Void 而不是 AnyCancelable
问题描述
我目前有一个发布者,其类型是AnyPublisher<[MyClass], Error>
我试图附加订阅者并捕获结果的AnyCancelable
. Xcode 的自动完成功能说我应该能够做到这一点,但是当实际输入代码时,我遇到了一个编译器错误,说返回的类型不是AnyCancelable
,但是()
这是我的代码示例:
let networkController = NetworkController()
let viewState = MyViewState()
let publisher: AnyPublisher<[MyClass], Error> = networkController.createPublisher()
let cancelable: AnyCancellable = publisher.subscribe(viewState)
Cannot convert value of type '()' to specified type 'AnyCancellable'
我的目标是在组合框架中包装一个现有的异步函数,它可以被多次调用,这样我就可以有一个很好的方法在重新分配请求时取消它,如下所示:
... self.cancelable = cancelable
解决方案
AnyPublisher
有两种 subscribe
将 a 附加Subscriber
到 a 的方法Publisher
。它从Publisher
协议中继承了两者。他们来了:
func subscribe<S>(_ subscriber: S)
where S : Subscriber, Self.Failure == S.Failure, Self.Output == S.Input
func subscribe<S>(_ subject: S) -> AnyCancellable
where S : Subject, Self.Failure == S.Failure, Self.Output == S.Output
所以,我猜你的MyViewState
类型不符合Subject
协议。因此,您不能使用subscribe
返回的版本AnyCancellable
。
Subject
是它的子协议,Publisher
它公开send
了用于注入Subject
然后发布的值的方法。你想让你的MyViewState
班级成为一个Publisher
? 我怀疑不是。
您可能想要做的是将您的MyViewState
类型更改为甚至不符合Subscriber
. 相反,使用AnyPublisher
'ssink
方法(也继承自Publisher
)将发布者连接到您的viewState
. 该sink
方法返回一个Sink
符合以下条件的对象Cancellable
:
func sink(
receiveCompletion: ((Subscribers.Completion<Failure>) -> Void)? = nil,
receiveValue: @escaping ((Output) -> Void))
-> Subscribers.Sink<Output, Failure>
如果需要,您可以将返回Cancellable
的包裹起来。AnyCancellable
因此:
let can = publisher.sink(
receiveCompletion: { viewModel.receive(completion: $0) },
receiveValue: { viewModel.receive($0) })
let anyCan = AnyCancellable(can)
推荐阅读
- javascript - 对nodejs+express+mongodb应用架构
- php - 有什么方法可以获取 GitHub 存储库中每个文件的最新提交日期和时间?
- c++ - 创建我的析构函数是一种好的编程习惯吗?
- postgresql - 子查询连接中第二个查询的空值
- javascript - 如何在不从表单中删除数据的情况下重置 BootstrapValidator?
- python - 使用 Keras 每 n 批次计算验证损失
- mysql - 从整个表中检查与 sql 中的 where 子句匹配的值
- sparql - Sparql 获取属性
- asp.net-mvc - 列表
ViewModel 在 POST 方法中为空 - angular - 如何将userId传递给Angular中的标头