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來遍歷處理結果。