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