返回Observable不起作用

时间:2018-04-15 19:53:19

标签: swift rx-swift

我正在玩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()
        }
    }

2 个答案:

答案 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),事件流可能会被破坏。你应该抓住它。