我想知道正确的方法是“向前”(如果那是这个术语)是我观察的观察者的观察者。
下面是一个例子。
我的函数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
}
答案 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
}