首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Combine转发对象

使用Combine转发对象
EN

Stack Overflow用户
提问于 2021-02-18 17:24:33
回答 1查看 35关注 0票数 1

为了更新视图,我想通过转发视图来将视图从我的ViewController转发到ViewModel。

类似于以下内容:

代码语言:javascript
复制
viewModel.labelViewModel.subscribe(forward: labelView) { labelView, model in labelView.update(with: model) }

而是使用组合。

那么我如何将观察者返回给观察者呢?

在ViewController中,我正在尝试:

代码语言:javascript
复制
viewModel.$labelModel.sink { lab in
    print("Value: \(lab?.1.text)")            
}.store(in: &subscriptions)

使用ViewModel中的标签:

代码语言:javascript
复制
@Published private(set) var labelModel: (Label, Label.Model)?

但我想要做的实际上是在接收器中返回与从ViewController订阅相同的标签。

这个是可能的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-18 20:55:03

你可以这样做:

代码语言:javascript
复制
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
}

这将允许您执行以下操作:

代码语言:javascript
复制
$labelModel
    .withUnretained(label)
    .sink { (completion) in
        if case .failure = completion {
            print("oops!")
        }
    } receiveValue: { (label, text) in
        label.text = text
    }
    .store(in: &subscriptions)

但是,当你可以做到这一点时,为什么要这么做呢?

代码语言:javascript
复制
$labelModel
    .sink { [label] text in
        label?.text = text
    }
    .store(in: &subscriptions)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66257019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档