我想订阅一个observable,但在某些逻辑中,我将重新订阅它,如果我不想为它编写一些特殊的逻辑,那么当我添加一个新的订阅或当我添加一个新的订阅时,如何处理最后的订阅订阅它我可以知道这个观察者是否已经订阅?RxSwift如何只订阅一次观察值?
0
A
回答
1
为什么你想这样做?你特别想解决什么问题?
处理订阅的常用方法是使用dispose包。
func subscribeMyObservable()
{
disposeBag = DisposeBag()
myObservable
.subscribe(onNext: { print("Whatever") }
.addDisposableTo(disposeBag)
}
请注意,我是如何在订阅前每次重新创建一次性的?这将摆脱以前的订阅。
0
.switchLatest()运营商是你的朋友
let eventObservableWrapper = PublishSubject<Observable<MyEvent>>()
let eventObservable = eventObservableWrapper.switchLatest() // use this one for subscriptions
// to switch to another observable, call -
eventObservableWrapper.onNext(someNewEventObservable)
看到更多关于如何开关在这里工作 - http://reactivex.io/RxJava/javadoc/rx/Observable.html#switchOnNext(rx.Observable)
0
你要什么做的,如果我可不是错的是认购和一旦物品排出,不会取消订阅。
如果这是你想要的,你可以使用relay
,你永远不会取消订阅。
/**
* ReplayRelay it works just like hot observables, once that an observer subscribe, the Relay will replay all items already emitted
* to another observer.
* it should return 1,2,3,4,5 for both observers.
*/
@Test
public void testReplayRelay() {
ReplayRelay<String> relay = ReplayRelay.create();
relay.subscribe(result -> System.out.println("Observer1:" + result));
relay.call("1");
relay.call("2");
relay.call("3");
relay.subscribe(result -> System.out.println("Observer2:" + result));
relay.call("4");
relay.call("5");
}
您可以在这里看到https://github.com/politrons/reactive/blob/master/src/test/java/rx/relay/Relay.java
0
最简单的解决方案的更多exmaples你正在寻找的东西确实是他们为这一点提供的方法 - func take(_ count: Int)
。
这里是一个游乐场样本:
import RxSwift
var variable = Variable(1)
variable.asObservable().take(1).subscribe(
onNext: { print("onNext: \($0)") },
onError: { print("onError: \($0)") },
onCompleted: { print("onCompleted") },
onDisposed: { print("onDisposed") })
variable.value = 2
print("done")
的结果是:
onNext: 1
onCompleted
onDisposed
done
是的,这是有用的,你想通过流来过滤事件的地方,在一个位置存储订阅尴尬。
相关问题
- 1. 如何观察RxSwift
- 2. 订阅可观察值
- 3. 只能调用一次的可观察订阅方法
- 4. 如何从订阅中返回观察值以订阅?
- 5. RxJava如何订阅可观察对象
- 6. 可观察终于订阅
- 7. RxSwift订阅ControlEvent
- 8. 如何取消订阅AngularFire数据库观察/订阅?
- 9. RxSwift多订阅一个observable
- 10. RxSwift toArray()不订阅
- 11. RxSwift - 订阅方法
- 12. 如何使用Angular2中的takeUntil取消订阅观察值
- 13. 使用RxSwift观察UITextField.editing
- 14. 选择器可观察 - RxSwift
- 15. RxJava等待一个观察者与订阅者等待另一个观察者与其他订阅者
- 16. 取消可观察订阅并等待观察者完成
- 17. RxSwift:如何让一个可观察触发另一个?
- 18. 在另一个可观察的订阅中嵌套可观察订阅是否可以接受
- 19. 淘汰赛订阅观察的对象
- 20. 订阅观察特性内observableArray在Knockout.js
- 21. 无法订阅可观察的上newThread
- 22. 商店取消订阅与观察者
- 23. 角2可观察订阅不工作
- 24. 订阅子组件的可观察(valueChanges)
- 25. 可观察订阅没有被调用
- 26. RxJava订阅阻挡观察到
- 27. Angular 2可观察订阅显示undefined
- 28. 在观察者中删除订阅
- 29. 如何确保一次活动只订阅一次
- 30. 在“beforeChange”订阅中获取可观察值的新值
谢谢你的回答。有一些逻辑我需要订阅动态盟友,所以有些时候可能会重新订阅一个可观察的,所以我只是觉得也许有一些特殊的可观察的,如果有新的订阅,它会自动取消或者其他一些聪明的方式,现在,我的解决方案就像你的解决方案。 – Bruno
你可以看看'takeWhile'或'takeUntil'运营商,但我认为最好的方式就是像我描述的那样。 – Odrakir