UniRx_UniTask_学习记录_2.3_Observable的性质

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,不用每次都生成新的
      在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值