swift - 使用组合转发对象
问题描述
为了更新视图,我想通过转发将视图从 ViewController 转发到 ViewModel。
类似于以下内容:
viewModel.labelViewModel.subscribe(forward: labelView) { labelView, model in labelView.update(with: model) }
但使用组合。
那么我怎样才能用 observable 返回观察者呢?
在 ViewController 我正在尝试:
viewModel.$labelModel.sink { lab in
print("Value: \(lab?.1.text)")
}.store(in: &subscriptions)
使用 ViewModel 中的标签:
@Published private(set) var labelModel: (Label, Label.Model)?
但我想要做的实际上是在接收器中返回与从 ViewController 订阅相同的标签。
这可能吗?
解决方案
你可以这样做:
extension Publisher {
func withUnretained<Object: AnyObject>(_ obj: Object) -> AnyPublisher<(Object, Output), Error> {
return tryMap { [weak obj] element -> (Object, Output) in
guard let obj = obj else { throw UnretainedError.failedRetaining }
return (obj, element)
}
.eraseToAnyPublisher()
}
}
enum UnretainedError: Swift.Error {
case failedRetaining
}
这将允许您执行以下操作:
$labelModel
.withUnretained(label)
.sink { (completion) in
if case .failure = completion {
print("oops!")
}
} receiveValue: { (label, text) in
label.text = text
}
.store(in: &subscriptions)
但是,当您可以做到这一点时,为什么还要这样做呢?
$labelModel
.sink { [label] text in
label?.text = text
}
.store(in: &subscriptions)
推荐阅读
- android - android模块aar文件的React Native中的NativeModule为空
- flutter - 如何在我的 Note 应用程序中实现提供程序,特别是 ChangeNotifierProvider 实现
- amazon-web-services - 使用 SAM 模板为 Lambda 事件创建非代理 API 网关
- xamarin - 如何从焦点更改 xamarin 中的占位符位置
- c++ - std::less 的严格总顺序
- three.js - 在threejs点云上画上千张小图
- python - 我想选择所有小于 50 的值我该怎么做
- google-workspace - 发送电子邮件的地址列表
- sql - 如何实现同一张表的一对多关系?
- python - python:实例化模块中的所有子类及其函数输出