如何返回/转发Observable.create(RxSwift)中的可观察对象

时间:2018-03-14 16:38:07

标签: swift rx-swift

我想知道正确的方法是“向前”(如果那是这个术语)是我观察的观察者的观察者。

下面是一个例子。

我的函数performSomeActionAfterConfirmation显示UIAlertController并返回一个新的observable。如果在警报控制器中选择“是”,我将otherObservable()“转发”给创建的observable的观察者。如果选择“否”,我只需完成观察。

我想我的代码会起作用,因为我在RxJava中做了类似的事情,但在这种情况下,我在self?.otherObservable().subscribe(observer)中收到一条警告说“调用'subscribe'的结果未使用”。

我想我必须将它分配给DisposeBag,但我不知道如何,因为该包由performSomeActionAfterConfirmation的调用者管理。也许我应该将它作为函数的参数传递?

func performSomeActionAfterConfirmation() -> Observable<String> {

    return Observable<String>.create { [weak self] observer in

        let alertCtrl = UIAlertController(title: "perform action", message: "do it?", preferredStyle: .alert)

        // yes -> forward another observable
        alertCtrl.addAction(UIAlertAction(title: "yes", style: .default, handler: { _ in
            self?.otherObservable().subscribe(observer) // Result call is unused
        }))

        // no -> just complete this observable
        alertCtrl.addAction(UIAlertAction(title: "no", style: .default, handler: { _ in
            observer.onCompleted()
        }))

        self?.host?.present(alertCtrl, animated: true)

        return Disposables.create()
    }
}

func otherObservable() -> Observable<String> {
    return Observable.empty() // dummy code
}

1 个答案:

答案 0 :(得分:3)

我相信是的,你可以通过&#34;外部&#34;将包放入您的功能。这是必要的,因为你的观察者基本上会订阅2个序列。一个是主要的,如果&#34; no&#34;被选中,一个是内部的,可以发出自己的事件。

但我相信,实现预期行为的一种更简单的方法就是逐步实现。我的意思是:

func performSomeActionAfterConfirmation() -> Observable<String> {

    return Observable<Void>.create { [weak self] observer in
        let alertCtrl = UIAlertController(title: "perform action", message: "do it?", preferredStyle: .alert)

        // yes -> emit one event and complete
        alertCtrl.addAction(UIAlertAction(title: "yes", style: .default, handler: { _ in
            observer.onNext()
            observer.onCompleted()
        }))

        // no -> just complete
        alertCtrl.addAction(UIAlertAction(title: "no", style: .default, handler: { _ in
            observer.onCompleted()
        }))

        self?.host?.present(alertCtrl, animated: true)
        return Disposables.create()
    }
    .flatMap { [weak self] _ -> Observable<String> in
        guard let `self` = self else { return .empty() }
        return self.otherObservable()
    }
}

func otherObservable() -> Observable<String> {
    return Observable.empty() // dummy code
}