RxSwift 将 Observable<String> 转换为 String

Posted

技术标签:

【中文标题】RxSwift 将 Observable<String> 转换为 String【英文标题】:RxSwift convert Observable<String> into String 【发布时间】:2019-08-16 09:37:44 【问题描述】:

我在 RxSwift 中将 Observable 转换为字符串时遇到了问题。

我知道 observable 是一个序列,我只想要用户名的最后一次更改。

我将用户名和密码存储为:

let username = BehaviorRelay<String>(value: "")
let password = BehaviorRelay<String>(value: "")

之前用过 combineLatest

func loginButtonValid(username: Observable<String>, password: Observable<String>) -> Observable<Bool> 
    return Observable.combineLatest(username, password)
     (username, password) in
        return username.count > 0
            && password.count > 0
            && self.validateEmail(enteredEmail: username)
    

但是我怎样才能从用户名中获取最新的呢?

我已经尝试过 takelast 并使用 combineLatest 仅带有一个参数,但似乎都不起作用。

我想这样做是为了验证一封邮件是否有效,我使用的验证邮件功能如下(仅供参考):

func validateEmail(enteredEmail:String) -> Bool 
    let emailFormat = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]2,64"
    let emailPredicate = NSPredicate(format:"SELF MATCHES %@", emailFormat)
    return emailPredicate.evaluate(with: enteredEmail)

我的尝试围绕以下想法进行

func emailValid(username: Observable<String>) -> Observable<Bool> 
        return username.takeLast()
         (lastusername) in
            return self.validateEmail(enteredEmail: (lastusername) )
        

【问题讨论】:

【参考方案1】:

如果我理解正确,您想将Observable&lt;String&gt; 转换为Observable&lt;Bool&gt;,这是map 方法的工作:

func emailValid(username: Observable<String>) -> Observable<Bool> 
    return username.map(self.validateEmail)

【讨论】:

不,这根本不是。我想对 Observable 的最后一个值执行一个函数以生成 Observable @WishIHadThreeGuns 你的意思是你希望得到的 observable 只有一个元素? 使用 combineLatest 看起来你可以获取最新的元素(每个元素都是单数的)——我想用一个元素来做到这一点。 @WishIHadThreeGuns map 应该这样做,不是吗?

以上是关于RxSwift 将 Observable<String> 转换为 String的主要内容,如果未能解决你的问题,请参考以下文章

在 RxSwift 中将 [Observable<T>] 转换为 Observable<[T]>

RxSwift 对 Observable 的扩展,其中 Element 是 Result<>

Observable<Observable<T>> 到 Observable<T> rxswift

RxSwift - 一个 Observable 中的多个 Observable 值

rxswift:如何获取 Observable<Any> 导致 Observable<[Category]> 的组合?

Observable<Bool> If else 在 RxSwift