我正在玩RxSwift以更好地理解这些概念。我正在尝试验证电子邮件。但是,当我返回Observable时,订阅者不会调用。我认为这可行。有什么建议吗?
var emailAddressValid: Observable<String>{
return self.userEmailAddress.asObservable().filter({ (userEmail) -> Bool in
userEmail.count > 0
}).flatMap({ (userEmail) -> Observable<String> in
if userEmail == "abcd@gmail.com"{
//This works perfectly
return .just("007")
} else {
let emailDomain = userEmail.components(separatedBy: "@").last
if emailDomain != nil {
//nothing happens in onNext
//This returns back an Observable<String>
return DataService.instance.checkDomainIsRegistered(domainName: emailDomain!)
} else {
return .just("0")
}
}
})
}
虽然该应用有效。但是,也没有任何编译器错误。但是当我返回DataService.instance.checkDomainIsRegistered(domainName:emailDomain!)时,Observer中的onNext不起作用
func checkDomainIsRegistered(domainName: String) -> Observable<String>{
print(domainName)
return Observable<String>.create{ data in
self._REF_DOMAIN_NAMES.queryOrdered(byChild: "domainName").queryEqual(toValue: domainName).observeSingleEvent(of: .value, with: { (domainNameSnapshot) in
if(domainNameSnapshot.exists()){
print("1")
data.onNext("1")
} else {
print("0")
data.onNext("0")
}
}, withCancel: { (error) in
data.onError(error)
})
data.onCompleted()
return Disposables.create()
}
}
答案 0 :(得分:1)
在您的示例中,调用
self._REF_DOMAIN_NAMES.queryOrdered(byChild: "domainName")
.queryEqual(toValue: domainName)
.observeSingleEvent(of: .value, with: { (domainNameSnapshot) in })
可能被分派到后台线程或队列。
与此同时,您的Observable checkDomainIsRegistered
随后在data.onCompleted()
完成,同时可能在主线程上运行。
结果是永远不允许调用onNext()
。您可以暂时删除onCompleted()
。
答案 1 :(得分:0)
如果调用data.onError(error)
,事件流可能会被破坏。你应该抓住它。