问题描述
我有一个类ClassWithProperty
,其中包含属性SomeProperty
,该属性是另一个类ClassWithEvent
的实例,并带有事件SomeEvent
。 ClassWithEvent
对象将定期更改。我需要ClassWithProperty
在ClassWithEvent
中保留对事件的单个更新订阅。
到目前为止,我已经提出了一种方法:
public ClassWithproperty()
{
Idisposable subscription = null;
this
.WhenAnyValue(x => x.someProperty)
.Do(x => subscription?.dispose())
.Where(x => x != null)
.Subscribe(x => subscription =
Observable.FromEventPattern(x,nameof(x.someEvent))
.Subscribe(y => SomeMethod()));
}
此解决方案确实有效,但是在某种程度上它并不像惯用的Reactive代码,而且对于我认为应该解决的一个相当典型的问题,它似乎也有些冗长。在Reactive中,有没有更好的方法来解决此类问题?
解决方法
使用Switch
运算符非常简单,该运算符切换到IObservable<IObservable<T>>
的最新生成的内部可观察值。它处理以前的订阅,并且只为您提供最新的可观察值。
IDisposable subscription =
this
.WhenAnyValue(x => x.SomeClass)
.Select(x => Observable.FromEventPattern(x,nameof(x.SomeEvent)))
.Switch()
.Subscribe(x => SomeMethod());
如果SomeClass
可以是null
(您的原始代码建议),那么您可以这样做:
IDisposable subscription =
this
.WhenAnyValue(x => x.SomeClass)
.Select(x =>
x == null
? Observable.Never<EventPattern<object>>()
: Observable.FromEventPattern(x,nameof(x.SomeEvent)))
.Switch()
.Subscribe(x => SomeMethod());