文章目录
2.3 Observable 的性质
- 由不同方法和时机生成的Observable 各有不同, 什么时候运作,如何运作。我们需要对这些有明确的了解
2.3.1 Observable 行动时机
-
声明Observable时,出入停止的状态,当跟各种 Operator进行连,并Subscribe()后才开始处理内部消息的传达
-
Observable 的构成和连接流程
-
-
Subscribe() 的时机 和 动作
-
再Subscribe()后,Operator才会接受消息
using UniRx; var subject = new Subject<string>(); // OnNext 的内容用空格隔开。最后再输出 var appendStringObservable = subject .Scan((previous, current) => previous + " " + current) .Last(); // Subscribe(这时 Observable 开始运作) appendStringObservable.Subscribe(x => Debug.Log(x)); subject.OnNext("I"); subject.OnNext("have"); subject.OnNext("a"); subject.OnNext("pen."); subject.OnCompleted(); subject.Dispose(); /* 结果 I have a pen. */
using UniRx; var subject = new Subject<string>(); // OnNext 的内容用空格隔开。最后再输出 var appendStringObservable = subject .Scan((previous, current) => previous + " " + current) .Last(); // Subscribe 前 发行消息 subject.OnNext("I"); subject.OnNext("have"); // 途中 Subscribe appendStringObservable.Subscribe(x => Debug.Log(x)); subject.OnNext("a"); subject.OnNext("pen."); subject.OnCompleted(); subject.Dispose(); /* 结果 a pen. */
-
不会处理 Subscribe() 之前发行的消息
-
2.3.2 Operator 的 实例化生成
// using UniRx;
var subject = new Subject<int>();
var observable = subject.Do(x => Debug.Log("Do:" + x));
// 订阅两次 Subscribe
observable.Subscribe(x => Debug.Log("First subscribe:" + x));
observable.Subscribe(x => Debug.Log("Second subscribe:" + x));
subject.OnNext(1);
subject.OnCompleted();
subject.Dispose();
/*
Do:1
First subscribe:1
Do:1
Second subscribe:1
*/
2.3.3 Hot Observable 和 Cold Observable
Cold Observable 是 谁都没有订阅处于停止状态的Observable,Hot Observable 则是已经再运作的Observable
Operator 基本上是Cold Observable
-
Hot 变换
-
使用Subject
using UniRx; var originalSubject = new Subject<string>(); // OnNext 的内容用空格隔开。最后再输出 var appendStringObservable = originalSubject .Scan((previous, current) => previous + " " + current) .Last(); // Subject var publishSubject = new Subject<string>(); // 这个时候 appendStringObservable 开始运作 appendStringObservable.Subscribe(publishSubject); originalSubject.OnNext("I"); originalSubject.OnNext("have"); // 途中 publishSubject 进行Subscribe publishSubject.Subscribe(x => Debug.Log(x)); originalSubject.OnNext("a"); originalSubject.OnNext("pen."); originalSubject.OnCompleted(); // 解除 Hot 変換 publishSubject.Dispose(); originalSubject.Dispose(); /* I have a pen. */
这样可以防止Operator 漏接消息
-
代替Subject 的专用 Operator
// using UniRx; var originalSubject = new Subject<string>(); // IConnectableObservable<string> IConnectableObservable<string> appendStringObservable = originalSubject .Scan((previous, current) => previous + " " + current) .Last() .Publish(); // Hot 变化的 Operator // IConnectableObservable.Connect() 内部的Subscribe开始执行 var disposable = appendStringObservable.Connect(); originalSubject.OnNext("I"); originalSubject.OnNext("have"); // appendStringObservable 直接Subscribe appendStringObservable.Subscribe(x => Debug.Log(x)); originalSubject.OnNext("a"); originalSubject.OnNext("pen."); originalSubject.OnCompleted(); // 解除Hot变换 disposable.Dispose(); originalSubject.Dispose();
还有很多别的变换用Operator
-
-
Hot变换的好处
-
所有的Operator 都处于运作状态并接受和床底消息
-
共有运作中的Operator,不用每次都生成新的
-