RxSwift 从 Observable 序列中的一项获取值

Posted

技术标签:

【中文标题】RxSwift 从 Observable 序列中的一项获取值【英文标题】:RxSwift obtain value from one item in Observable sequence 【发布时间】:2016-10-14 11:38:01 【问题描述】:

我正在尝试逐渐将我的应用程序转换为 RxSwift / MVVM。但我认为我做错了一些事情。

在此示例中,我有一个包含此特定信息的静态表。

    let itens = Observable.just([
        MenuItem(name: GlobalStrings.menuItemHome,      nameClass: "GPMainVC"),
        MenuItem(name: GlobalStrings.menuItemProfile,   nameClass: "GPMainVC"),
        MenuItem(name: GlobalStrings.menuItemLevels,    nameClass: "GPLevelsVC"),
    ])

当用户选择一个单元格时,我需要知道模型(MenuItem)和索引,但我无法做到这一点

 tableView.rx
        .itemSelected
        .map  [weak self] indexPath in
            return (indexPath, self?.modelView.itens.elementAt(indexPath.row))
        
        .subscribe(onNext:  [weak self] indexPath, model in

            self?.tableView.reloadData()

            //can´t get MenuItem because model its a observable
            //self?.didSelect((indexPath as NSIndexPath).row, name.nameClass)

        )
        .addDisposableTo(disposeBag)

提前致谢

【问题讨论】:

你的itens 真的是一个序列吗(因为这才是真正的可观察对象,即你可以“观察”的事件序列)?它看起来的样子,itens 只是某种字典,你想用它来查找 MenuItem 。如果是这种情况,那么您不应该从中观察到。 感谢您的回答@Anton Bronnikov。但是你建议改用什么? 【参考方案1】:

您必须执行以下步骤:

    使用变量。我认为在您的情况下这是一个更好的解决方案。

    let itens = Variable([
        MenuItem(name: GlobalStrings.menuItemHome, nameClass: "GPMainVC"),
        MenuItem(name: GlobalStrings.menuItemProfile, nameClass: "GPMainVC"),
        MenuItem(name: GlobalStrings.menuItemLevels, nameClass: "GPLevelsVC"),
    ])
    

    如果您想从单击的单元格中获取索引和模型,请使用以下代码。

    tableView.rx
    .itemSelected
    .map  index in
        return (index, self.items.value[index.row])
    
    .subscribe(onNext:  [weak self] index, model in
        // model is MenuItem class
    )
    .addDisposableTo(disposeBag)
    

    希望我的回答对你很有帮助。如果您想了解有关您的任务中的 RxSwift 机会的更多信息,请告诉我。祝你好运!

【讨论】:

非常感谢@Svyatoslav。但我需要索引和模型。这就是我尝试使用 itemSelected 运算符的原因。知道如何实现吗?谢谢 @DaSilva,我刚刚修正了我的答案。请检查一下。 @DaSilva,如果它解决了您的问题,请不要忘记将我的回答标记为正确。 再次感谢您的回答。但是使用“let itens = Variable”我失去了使用“tens.bindTo”的选项 @DaSilva,你应该使用 items.asObservable().bindTo()。

以上是关于RxSwift 从 Observable 序列中的一项获取值的主要内容,如果未能解决你的问题,请参考以下文章

iOS RxSwift - 如何“断开”一个 observable?

RxSwift之深入解析核心逻辑Observable的底层原理

RxSwift 系列

RxSwift 系列

RxSwift 系列

在 RxSwift 中具有来自 Observable 的最后两个元素的运算符