zhouqijie

UniRx事件流并行处理



使用Merge合并事件流

UniRx可以开启多个事件流,然后用Merge进行事件流的合并。

var leftMouseClickStream = Observable.EveryUpdate().Where(_ =>
Input.GetMouseButtonDown(0));
var rightMouseClickStream = Observable.EveryUpdate().Where(_ =>
Input.GetMouseButtonDown(1));

Observable.Merge(leftMouseClickStream, rightMouseClickStream)
.Subscribe(_ =>
{
// do something
2
});
public class TestPanel : XXXPanel
{
[SerializeField] Button mButtonA;
[SerializeField] Button mButtonB;
[SerializeField] Button mButtonC;
void Start()
{
    var buttonAStream = mButtonA.OnClickAsObservable();
    var buttonBStream = mButtonB.OnClickAsObservable();
    var buttonCStream = mButtonC.OnClickAsObservable();

    Observable.Merge(
        buttonAStream,
        buttonBStream,
        buttonCStream)
        .First()
        .Subscribe(_ =>
        {
            // any button clicked
        });
    }
}



使用WhenAll操作符

Siki:WhenAll也是处理多个流的操作符。
Siki:WhenAll就是当所有的事件流都结束,就会触发回调。
Siki:WhenAll可以用于协程事件流,也可用于其他事件流。

示例:

var aStream = mButtonA.OnClickAsObervable().First();
var bStream = mButtonB.OnClickAsObervable().First();
var cStream = mButtonC.OnClickAsObervable().First();

Observable.WhenAll(
    aStream,
    bStream,
    cStream)
    .Subscribe(_ =>
    {
        Debug.Log("clicked");
    })
    .AddTo(this);

//当点击完A、B、C按钮之后就会输出。    



事件流的结束

Siki:有的事件流是有结束事件的,比如Timer、First、Coroutine等,有的则没有,比如EveryUpdate等。
Siki:Subscribe的第一个参数是OnNext回调,第二个参数则是OnComplete回调。

Observable.FromCoroutine(A)
    .Subscribe(_ =>
    {
       Debug.Log("OnNext:");
    }, () =>
    {
       Debug.Log("OnCompleted:");
    });

(END)