ISubject interfaces
本章中的4个subjects 都通过了下面这样一个接口来实现了 IObservable<T> 和IObserver<T>接口:
下面这个接口是之前所有接口的超集:
这些接口并不常用,但被证明在subjects 不共享一个共同的基类时是非常有用的,我们将在介绍“冷”和“热”可观测物概念后介绍这些接口。
Subject factory
最后,值得注意的是subject 也可以通过工厂方法来创建。考虑到subject结合了IObservable<T>和IObserver<T>两个接口,使用工厂模式来将它们组合起来是更好的选择;Subject.Create(IObserver<TSource>, IObservable<TResult>) 方法就可以做到:
Lifetime management
RX的一个特点是当你使用时不知道它的生命周期(何时提供值,何时终止),但这并不阻碍一定程度上的确定性,你可以控制何时开始接受value,以及何时停止接受。RX提供了细粒度的对subscriptions(订阅物)生命周期的控制。使用常用接口,可以确切的释放所查询的相关资源。
之前介绍了关键类型及一些例子,为了让例子更易于理解我们忽略了 IObservable<T>接口中的一个重要部分:Subscribe方法Subscribe方法接受一个IObserver<T>类型的参数,但也可以使用一个在内部调用Action<T>委托的扩展方法来代替,而无论是原始方法还是扩展方法都有其返回值,它的类型是 IDisposable,接下来我们来探讨一下如何利用返回值管理subscriptions(订阅物)的生命周期。
Subscribing
先让我们看一下Subscribe扩展方法的所有重载。之前使用的是简单的Subscribe 重载,允许我们传递一个Action<T>委托在OnNext 被调用时执行,下面的这些重载也可以避免创建和传递IObserver<T>实例:
这些重载通过不同的组合来配合你需要的操作(OnNext、OnError或OnCompleted),需要注意的是,如果你使用了一个未为错误消息指定具体处理委托的重载方法,任何错误通知都将被作为exception重新抛出。考虑到错误可能出现在任何时间,这将使调试变得非常困难。通常最好是使用指定了具体处理委托的重载方法来进行配合。
在下面的例子中,我们尝试用.Net标准的try catch句式来处理异常:
正确的处理方式应该是为错误信息提供一个委托,如下面的例子:
看你认真写了3篇日志了,祝你学有所成。
@Oncle:谢谢~