11.UniRx序列(Concat、Defer、Empty、FromAsyncPattern、Throw、RefCount、Publish、Pairwise)

Concat
Defer
Empty
FromAsyncPattern
Throw
RefCount
Publish
Pairwise

Concat

連接多個流,按照一定的先後順序將多個流串聯到一起,流包裝的數據類型必須一致,圖解
在這裏插入圖片描述
執行結果
在這裏插入圖片描述
代碼示例

public class No10_Mixed1 : MonoBehaviour
{
    void Start()
    {
        var take = Observable.EveryUpdate().Take(3);
        var @return = Observable.Return<long>(100);

        var concat = Observable.Concat(take, @return);
        concat.Subscribe(Next, Error, Complete);
    }

    void Next(long value)
    {
        Debug.LogFormat("Concat之後流的數據是:{0}", value);
    }

    void Error(Exception ex)
    {
        Debug.LogException(ex);
    }

    void Complete()
    {
        Debug.LogFormat("Complete");
    }
}

代碼解析

之前的命名規範都有添加Stream,這個沒有添加到命名裏面去的;因爲我們寫的不是Framework,不需要全程來命名的,我建議如果你對一個知識點不熟悉的話,那麼你命名的時候最好寫全一些,這樣你自己閱讀起來方便;一個知識點熟悉了以後,可以以最簡短的命名來給變量命名,@return是爲了和編程字段區分開來,@在C#裏面是一個合格字符,可以用來命名。


Defer

在沒有訂閱者訂閱之前,不會創建Observable,每次有訂閱者來訂閱的時候,Defer會創建一個新的Observable,圖解
在這裏插入圖片描述
執行結果
在這裏插入圖片描述
代碼示例

public class No10_Mixed1 : MonoBehaviour
{
    void Start()
    {
        var defer = Observable.Defer(DeferMethod);
        defer.Subscribe(Next, Error, Complete);
    }

    IObservable<int> DeferMethod()
    {
        return Observable.Return(100);
    }

    void Next(int value)
    {
        Debug.LogFormat("Defer之後新流的數據是:{0}", value);
    }

    void Error(Exception ex)
    {
        Debug.LogException(ex);
    }

    void Complete()
    {
        Debug.LogFormat("Complete");
    }
}

代碼解析
Defer是一個基礎流,創建的過程由用戶自行指定,一般是由Observable的靜態工廠方法來生成


Empty

創建一個新流,只會發射Complete數據,圖解
在這裏插入圖片描述
執行結果

在這裏插入圖片描述
代碼示例

public class No10_Mixed1 : MonoBehaviour
{
    void Start()
    {
        var empty = Observable.Empty<int>();
        empty.Subscribe(Next, Error, Complete);
    }

    void Next(int value)
    {
        Debug.LogFormat("Empty之後新流的數據是:{0}", value);
    }

    void Error(Exception ex)
    {
        Debug.LogException(ex);
    }

    void Complete()
    {
        Debug.LogFormat("Complete");
    }
}

代碼解析


FromAsyncPattern

不知道幹什麼用的,Rx官方的說明是將非Observable的對象轉換成Observable的對象,圖解
在這裏插入圖片描述
第一條線是普通數據,各自沒有一點關係的
經過From轉換以後,數據全部串聯在一起成了一個流?

執行結果
代碼示例

public class No10_Mixed1 : MonoBehaviour
{
    void Start()
    {
        var pattern = Observable.FromAsyncPattern(PatternBegin, PatternEnd);
        pattern = Result;
    }

    IObservable<Unit> Result()
    {
        Debug.LogFormat("Result");
        return null;
    }

    IAsyncResult PatternBegin(AsyncCallback callback, object obj)
    {
        Debug.LogFormat("PatternBegin");
        return null;
    }

    void PatternEnd(IAsyncResult callback)
    {
        Debug.LogFormat("PatternEnd");
    }

    void Next(Unit value)
    {
        Debug.LogFormat("Merge之後流的數據是{0}", value);
    }

    void Error(Exception ex)
    {
        Debug.LogException(ex);
    }

    void Complete()
    {
        Debug.LogFormat("Complete");
    }
}

代碼解析


Throw

創建一個流,沒有任何輸出信息,拋出一個錯誤來結束,圖解
在這裏插入圖片描述
執行結果
在這裏插入圖片描述

代碼示例

public class No10_Mixed1 : MonoBehaviour
{
    void Start()
    {
        var @throw = Observable.Throw<string>(new ArgumentException("throw exception"));
        @throw.Subscribe(Next, Error, Complete);
    }

    void Next(string value)
    {
        Debug.LogFormat("Throw之後流的數據是{0}", value);
    }

    void Error(Exception ex)
    {
        Debug.LogException(ex);
    }

    void Complete()
    {
        Debug.LogFormat("Complete");
    }
}

代碼解析


RefCount & Publish

RefCount是將斷開的Observable重新連接到一起,配合Publish一起使用,圖解
在這裏插入圖片描述
基礎流由3個子流構成,紅、綠、藍圓形
紅綠流經過Publish以後解體,最左邊的第一個Subscribe訂閱的是Publish之後的流,沒有任何輸出
Connect表示Publish之後是可連接的,經過第二輪RefCount
最後兩條線開始輸出數據第一條在紅圓之前訂閱,輸出了參與的所有數據,第二條在綠圓之前訂閱,只輸出了綠圓之後的數據
緊挨着的三個Unsubscribe是表示,使用Unsubscribe可以返回到始發流,分別是Publish始發和RefCount始發的數據

執行結果

在這裏插入圖片描述
代碼示例

public class No10_Mixed1 : MonoBehaviour
{
    void Start()
    {
        var take = Observable.EveryUpdate().Take(3);
        var refCount = take.Publish().RefCount();
        refCount.Subscribe(Next, Error, Complete);
    }

    void Next(long value)
    {
        Debug.LogFormat("Connectable之後流的數據是{0}", value);
    }

    void Error(Exception ex)
    {
        Debug.LogException(ex);
    }

    void Complete()
    {
        Debug.LogFormat("Complete");
    }
}

代碼解析

Publish使用之後流都是斷開的,因爲是斷開的,構成不了流的特性,不會有任何數據輸出;斷開之後的流是一個Connectable的流,那麼這個字段的意義在哪裏呢,重構邏輯的時候,比如寫了一個戰鬥邏輯,有需求要更改戰鬥方式,因爲Rx是串聯編程的方式;那必須得重新構建一套代碼來適應新的戰鬥邏輯?用了Publish之後,斷開剔除不需要的內容,是不是高級?然後再用RefCount把斷開的流串聯到一起構成新的數據流,那麼擁有了Rx編程的實用性。


PairWise

Pairwise處理成對的數據,如果數據少於2個,則不處理

執行結果
在這裏插入圖片描述
代碼示例

public class No10_Mixed1 : MonoBehaviour
{
    void Start()
    {
        var pairwise = Observable.Range(1, 3).Pairwise();
        pairwise.Subscribe(Next, Error, Complete);
    }

    void Next(Pair<int> value)
    {
        Debug.LogFormat("Pair之後流的數據是{0}, {1}", value.Previous, value.Current);
    }

    void Error(Exception ex)
    {
        Debug.LogException(ex);
    }

    void Complete()
    {
        Debug.LogFormat("Complete");
    }
}

代碼解析


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章