我有一个可观察的对象,它管理一个名为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任何运算符来实现此目标:
非常感谢。
答案 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()
将:
profileObservable
avatar
initialLetters
initialMarksSubject
订阅initialMarks
将返回您需要为UI显示的信息
使用您的UI组件
viewModel.initialMarks
.observeOn(MainScheduler.instance)
.bind(to: profileLabel.rx.text)
.disposed(by: disposeBag)