09.UniRx序列(Select、SelectMany、Create、CreateSafe、CreateWithState)

Select
SelectMany
Create
CreateSafe
CreateWithState

Select

選擇流裏面的數據來進行操作,Select的作用和Do類似,沒有Do執行那麼強烈,Do是封裝了所有的數據,依次在Next,Error,Complete方法裏面依次進行了包裝;Select只對Next方法裏面的數據進行了包裝,有兩種作用,過濾和加工,加工在計算機編程裏面一般稱爲map,映射;通過映射將一個數據進行處理,圖解
Select映射,對數據進行封裝加工
在這裏插入圖片描述
Select對數據進行過濾處理
在這裏插入圖片描述
執行結果
在這裏插入圖片描述
代碼示例

public class No09_Select : MonoBehaviour
{
    void Start()
    {
        var updateStream = Observable.EveryUpdate();
        var selectValue = updateStream.Select(SelectWhat);

        var disposable = selectValue.Subscribe(Next, Error, Complete);
        disposable.AddTo(this);
    }

    bool SelectWhat(long frame)
    {
        if (frame % 100 == 0)
        {
            return true;
        }

        return false;
    }

    void Next(bool value)
    {
        Debug.LogFormat("執行結果:{0}", value);
    }

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

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

代碼解析


SelectMany

對多個流進行Select,Select的基礎作用是對流裏面的數據進行加工或者過濾;SelectMany將多個流的數據進行加工或者過程處理,處理的結果符合就近原則,以最後一個流的返回結果作用爲最終的實體輸出;但之前流的作用依然會存在,SelectMany是一種複合狀態,比如我邊走路邊唱歌,歌聲是實體輸出,但走路的效果依然會存在,圖解
在這裏插入圖片描述
第一條線是基礎流,開始輸出數據
中間的是選擇了多個流之後,數據開始由圓形變成菱形
最終輸出的結果依然保持了基礎流的顏色,數據部分存檔

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

public class No09_Select : MonoBehaviour
{
    void Start()
    {
        var updateStream = Observable.EveryUpdate();
        var returnStream = Observable.Return(true);
        var selectManyStream = Observable.SelectMany(updateStream, returnStream);

        var disposable = selectManyStream.Subscribe(Next, Error, Complete);
        disposable.AddTo(this);
    }

    void Next(bool final)
    {
        Debug.LogFormat("SelectMany執行結果:{0}", final);
    }

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

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

代碼解析


Create

Create在使用的時候必須指定一個類型,Create既是基礎流,也是功能流;創建一個新流,流的數據需要自行填充,有點和Subject類似,相比之下,要比Subject輕度很多,圖解
在這裏插入圖片描述
Create之後需要指定Next數據輸出到訂閱者,Complete也需要自行手動設置

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

public class No09_Select : MonoBehaviour
{
    void Start()
    {
        var createStream = Observable.Create<string>(CreateMethod);
        var disposable = createStream.Subscribe(Next, Error, Complete);
        disposable.AddTo(this);
    }

    IDisposable CreateMethod(IObserver<string> observer)
    {
        observer.OnNext("From CreateMethod.");
        observer.OnCompleted();
        return null;
    }

    void Next(string value)
    {
        Debug.LogFormat("Create執行結果:{0}", value);
    }

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

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

代碼解析


CreateSafe

和Create功能一樣,在onNext方法發生錯誤的時候會自動解體,一般用於ColdObservable;

HotObservable & ColdObservable
HotObservable不管有沒有訂閱者,事件都會發生,擁有多個訂閱者的時候,是一對多的關係
ColdObservable在沒有訂閱者的時候,不會發生事件,多個訂閱者訂閱的時候,是一對一的關係,各自獨立


CreateWithState

使用狀態來標示一個流並且把流創建出來,一般用於狀態機的時候使用

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

public class No09_Select : MonoBehaviour
{
    void Start()
    {
        int state = 1;
        var createStream = Observable.CreateWithState<string, int>(state, CreateMethod);
        var disposable = createStream.Subscribe(Next, Error, Complete);
        disposable.AddTo(this);
    }

    IDisposable CreateMethod(int state, IObserver<string> observer)
    {
        if (state == 0)
        {
            observer.OnNext("From State0 CreateMethod.");
            observer.OnNext("From State0 CreateMethod.");
            observer.OnCompleted();
        }
        else if (state == 1)
        {
            observer.OnNext("From State1 CreateMethod.");
            observer.OnNext("From State1 CreateMethod.");
            observer.OnCompleted();
        }

        return null;
    }

    void Next(string value)
    {
        Debug.LogFormat("Create執行結果:{0}", value);
    }

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

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

代碼解析


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