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");
}
}
代碼解析