最近接触到了uniRx,进而开始学习响应式编程。说起来好像有点晚了,但目前市面上仍然没有比较好的相关书籍,网络上的介绍也不多,于是打算从0开始啃英文资料,顺便找个地方把笔记做一做。
uniRX的GITHUB页面上推荐了一篇关于RX的不错的教程,确实写的不错,我生撸了半天看完了才发现早已经有翻译好的版本,真是心疼我查字典浪费掉的时间……不过这一篇是以JS为例写的,于是我又找到了一篇很详细的C#版本的RX入门,地址如下:http://www.introtorx.com/Content/v1.0.10621.0/01_WhyRx.html
随便搜索了下,貌似确实没什么人进行过翻译,但读完PART1之后感觉上相对http://reactivex.io/等其他网站的入门指引来说更适合我的阅读习惯,于是选择了这一篇来学习,并不是说一定这个网站就是最好的,如有更好的推荐可以留言或者怎样交流一下。
闲话说到这里,下面整理出来的仅仅是我认为需要记的,并不是文章的全部内容。出于个人习惯,由于英语水平不好,读的时候会拿纸质的笔记本先粗粗的过一遍,然后再理一边放电脑或者网络上保存起来。有些内容我觉得本子上写过就算了,所以不会全部都搬到网站上来(懒癌晚期少打几个字都是好的),所以这里的内容并不是原文的全部内容
--------------------------------------------------------------------------------------------------------------
RX的概念:
RX采用了观测者模式,通过观察者和可观测物两个接口将“某一时间段内事件的集合”概念化为事件流,或可以称为“事件队列”。
RX的主要使用场景:
UI事件,如鼠标移动、按钮点击
Domain 事件,如属性变化,collection 更新等
文件、系统等底层事件
整合事件,就像从消息中心的广播,或者是WebSockets API推送的消息等
RX的次要应用场景:
Task 或 Task<T>的Result
FileStream BeginRead或EndRead这样的APM方法调用后的Result
不建议使用RX的场景:
仅仅为了可以支持RX就将现有的IEnumerable对象转为IObservable对象
Message queues还是用IEnumerable合适
Key types
IObserver<T>和IObservable<T> 是RX的两个基础类型,ISubject<TSource, TResult>同时继承了IObserver<T>和IObservable<T> 两个接口。
IObservable<T>:
只有一个Subscribe (订阅方法)的简单接口,可以把实现了该接口的对象想象为该对象的流或者队列(前文提到的uniRX的GITHUB页面上推荐的以JS为例的文章中使用了stream,也就是流为概念的说明方法,并解释一切都可以是stream,但由于NET已经有了system.io.stream类型极其子类型所形成的流的概念,RX流与IO流最根本的区别在于RX流不具备IO流的查找和写入功能。为了防止混淆,我们之后将称其为队列“sequence”):
IObserver<T>:
IEnumerable<T>有三个成员: (the next value, an exception 或结束 sequence);IObserver<T>也有相应的三个:OnNext(T), OnError(Exception) 和 OnCompleted().
RX有一个隐藏的协议必须遵守:一个IObserver<T>的实现必须在0次或多次调用OnNext(T)后必须跟随OnError(Exception)或者OnCompleted()中的一个调用。这将确保如果序列终止,它将是被OnError(Exception) 或 OnCompleted()终止的。
该协议不要求何时调用,这使得无穷空序列概念可以使用,后面会谈到这点。通常,使用更多的是IObservable<T>而不需要关心IObserver<T>,因为RX提供了如Subscribe(订阅)这样的匿名实现的方法。
实现IObserver<T>和IObservable<T>:
这两个接口实现起来都很容易,下面的例子为创建一个打印信息的IObserver<T>(观测者):
我们可以看到,在上面实现的接口对象中,主要处理的是三种状态分别如何对收到的value进行具体的处理,也就是说这个对象主要是对接收到value进行具体的处理。
实现IObservable<T>(可观测物)队列稍微复杂一些,一个极简化的IObservable<T>队列的例子如下:
而在这里的实现中,该对象的唯一成员订阅方法中所处理的是发送何种信息,也就是说这个对象主要是处理发送消息相关的实务(向谁发送、发送什么、发送几次、完成处理、错误处理等等)
我们可以把这两个实现结合起来得到下面的输出 :
Output: Received value 1 Received value 2 Received value 3 Sequence terminated |
暂无关于此日志的评论。