为了更新视图,我想通过转发将视图从ViewController转发到ViewModel。
类似于以下内容:
viewModel.labelViewModel.subscribe(forward: labelView) { labelView, model in labelView.update(with: model) }
但使用合并。
那么我该如何将观察者返回观察者呢?
在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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句