这是个神奇的操作符,本质功能和select一样 提供一种转换
只是你必须把传来的对象转换成可迭代的对象。
很直观的用法可以打散容器里的容器,比如一个list<string> 对他进行默认selectMany后 就会变成一堆char
下面,展现一种非常imba的用法
可以任意组合协程的执行顺序!!
public class SelectMany : MonoBehaviour
{
void Start()
{
var a = Observable.FromCoroutine(A);
var b = Observable.FromCoroutine(B);
var c = Observable.FromCoroutine(C);
//对协程执行顺序进行任意组合
//原理是协程(可观察的)默认只会在结束后被观察到一次,A结束后被转成了B,B结束后又转成了C ,全部观察完后 输出end
a.SelectMany(b.SelectMany(c)).Subscribe(_ => print("end"));
//a.SelectMany(sa=> {
// print("a convered to b");
// return b;
//}).Subscribe(_=>print("end"));
//todo怎么组合带参数的协程?
}
IEnumerator A()
{
yield return new WaitForSeconds(1.0f);
print("A");
}
IEnumerator B()
{
yield return new WaitForSeconds(1.0f);
print("B");
}
IEnumerator C()
{
yield return new WaitForSeconds(1.0f);
print("C");
}
}
其原理在注释中已经提到,协程被UniRx转换成Observable以后,默认只会在结束后返回一次(上面有测试代码),
所以在A结束后,把B返回出去继续观察,B观察完了,C继续。 就实现了协程顺序的任意组合!!
可以想见一些只返回一次的序列 都可以这样随意顺序组合
另一个操作符concat也能随意组合流的顺序
他们的区别是 concat后的订阅是基于每个流的,不是针对整体的结束