为了更新视图,我想通过转发视图来将视图从我的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订阅相同的标签。
这个是可能的吗?
发布于 2021-02-18 20:55:03
你可以这样做:
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)https://stackoverflow.com/questions/66257019
复制相似问题