将RxSwift可观察结果绑定到另一个可观察结果

时间:2019-11-11 08:21:18

标签: ios rx-swift

我有一个可观察的对象,它管理一个名为Profile的对象:

class Profile {
    let name. : String
    let surname : String
    let avatar: String?
}
Observable<Profile>

此可观察对象绑定到视图模型,该视图模型同时具有一个称为

的可观察属性
var initialMarks:Observable<String>

这是名称和姓氏属性的首字母。如果头像属性为nil,则会显示此首字母。

我有一个返回字符串首字母的函数:

func initialLetters(first:String, second: String) -> String

如何通过使用RxSwift任何运算符来实现此目标:

  1. 访问头像属性。
  2. 检查它是否为零。
  3. 如果为零,则调用函数initialLetters。
  4. 将函数initialLetters绑定到可观察的initialLetters。

非常感谢。

2 个答案:

答案 0 :(得分:2)

这只是一个简单的映射...

这里就是它自己的视图模型。

func initialMarks(for profile: Observable<Profile>) -> Observable<String> {
    return profile
        .compactMap { profile in
            if profile.avatar == nil {
                return initialLetters(first: profile.name, second: profile.surname)
            }
            else {
                return nil
            }
        }
}

如果要将其嵌入到视图模型struct / class中,则可以执行以下操作:

struct ViewModel {
    let profile: Observable<Profile>

    var initialMarks: Observable<String> {
        return profile
            .map { profile in
                if profile.avatar == nil {
                    return initialLetters(first: profile.name, second: profile.surname)
                }
                else {
                    return ""
                }
            }
    }
}

以上两种实现方式也有所不同,具体取决于您要使用的内容...在第一个实现中,仅在化身为nil时才发出缩写,在第二个实现中化身存在时则发出空字符串,而在化身时则以缩写开头零。

答案 1 :(得分:-1)

对于此特定示例,您需要使用PublishSubject,因此您可以绑定流initialMarksSubject并以Observable的方式对其进行观察

设置

private var initialMarksSubject = PublishSubject<String>()
private let disposeBag = DisposeBag()

private func observeInitialMarks() {
    profileObservable
        .filter { $0.avatar == nil } // only take elements that have a nil avatar
        .map { self.initialLetters(first: $0.name, second: $0.surname) } // transform profile to initialLetters of type String
        .bind(to: initialMarksSubject) // bind the stream to your subject
        .disposed(by: disposeBag)
}

var initialMarks: Observable<String> {
    return initialMarksSubject.asObservable()
}

说明

呼叫observeInitialMarks()将:

  1. 订阅profileObservable
  2. 仅接受没有avatar
  3. 的配置文件
  4. 将个人资料转换为initialLetters
  5. 将事件绑定到initialMarksSubject

订阅initialMarks将返回您需要为UI显示的信息

使用您的UI组件

viewModel.initialMarks
    .observeOn(MainScheduler.instance)
    .bind(to: profileLabel.rx.text)
    .disposed(by: disposeBag)