13.UniRx序列(Start、AsObservable、AsSingleUnitObservalbe、AsUnitObservable、ToAsync、ForEachAsync)

Start
AsObservable
AsSingleUnitObservable
AsUnitObservable
ToAsync
ForEachAsync

Start

啓動一個異步方法來返回方法的執行結果,創建一個流,將流的方法數據輸出到基礎流,圖解

在這裏插入圖片描述

執行結果

在這裏插入圖片描述

代碼示例

public class No13_Mixed3 : MonoBehaviour
{
    void Start()
    {
        var start = Observable.Start(StartMethod);
        start.Subscribe(Next, Error, Complete);
    }

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

    void Next(Unit unit)
    {
        Debug.LogFormat("Start事件發生了");
    }

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

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

代碼解析

Start一般用於啓動一個線程,執行阻塞或者耗時的操作,使用了C#的await關鍵詞來融合


AsObservable

將原始數據轉換到流,跟之前的From差不多,那個不知道用法的字段,圖解

在這裏插入圖片描述

執行結果

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

public class No13_Mixed3 : MonoBehaviour
{
    void Start()
    {
        var asObservable = Observable.Return(100).AsObservable();
        asObservable.Subscribe(Next, Error, Complete);
    }

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

    void Next(int val)
    {
        Debug.LogFormat("asObservable異步事件發生了,數值:{0}", val);
    }

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

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

代碼解析

AsObservable,將一個非Observable數據轉換到Observable數據,轉換過來的數據會變成異步數據,但不會影響基礎流的數據包裝類型;Observable大多數方法都是異步方法,非MicroCoroutine的異步就是async/await的異步方式,非常優雅。


AsSingleUnitObservable

和AsObservalbe差不多,會影響流的包裝類型,如果是多個流則轉換之後變成一個流,按照就近原則來處理流,取最後或最近的一個流作爲結果輸出

執行結果
代碼示例
代碼解析

AsSingleUnitObservable會將轉換過來的流強行轉換到Unit的包裝類型,並且只取一個


AsUnitObservable

和AsSingleUnitObservable差不多,但不會影響流的結果輸出,也不會按照流的就近原則來處理流

執行結果
代碼示例
代碼解析


ToAsync

ToAsync和Start功能類型,開啓一個新的線程處理耗時工作,可以轉換流到函數指針,圖解

在這裏插入圖片描述

執行結果

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

public class No13_Mixed3 : MonoBehaviour
{
    void Start()
    {
        var toAsync = Observable.ToAsync(ToAsyncMethod);
        toAsync = ToAsyncHandler;
        var invoke = toAsync.Invoke();
        invoke.Subscribe(Next, Error, Complete);
    }

    private IObservable<Unit> ToAsyncHandler()
    {
        Debug.LogFormat("ToAsyncHandler");
        return Observable.ReturnUnit();
    }

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

    void Next(Unit unit)
    {
        Debug.LogFormat("ToAsync -> Invoke事件發生了");
    }

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

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

代碼解析

對於返回這種特殊的函數指針,處理的方式就是賦值以後直接Invoke(),不能直接調用,不能像C++那樣直接調用指針地址,在C#裏面,直接Invoke;通過反射來實例化一個out類型的指針函數,之前的那個From轉換的也應該是這樣處理的;*第一步ToAsync,裏面需要一個action來回調,這個方法在主線程裏面執行,表示開始進行異步操作了,是不是要做什麼準備,預處理什麼;*當這個方法返回以後,進行了下一步的,函數指針處理階段,這個方法處理的是異步數據,可以進行阻塞操作,當這個IObservable返回以後,表示阻塞的事件結束;可以進行流的後續操作。


ForEachAsync

ForEachAsync通過異步的方式將一個數據列表全部遍歷出來,符合就近原則,會影響基礎流的包裝類型

執行結果

在這裏插入圖片描述

代碼示例

public class No13_Mixed3 : MonoBehaviour
{
    void Start()
    {
        var range = Observable.Range(1, 3);
        var forEachAsync = range.ForEachAsync(NextForEach);
        forEachAsync.Subscribe(Next, Error, Complete);
    }

    void NextForEach(int val)
    {
        Debug.LogFormat("NextForEach 事件發生了,數據:{0}", val);
    }

    void Next(Unit val)
    {
        Debug.LogFormat("Next 事件發生了");
    }

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

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

代碼解析

是UniRx特有的遍歷方式,好處是由於是異步遍歷,可能數據遍歷的輸出順序不一致;但不會影響最終的輸出結果,當我們存在一個數據列表有多個Observable的時候,可以使用ForEachAsync來遍歷處理結果。


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