我使用的是Unity3D的StartCoroutine方法,我有一個關於嵌套協程的問題。使用IEnumerator與Unity3d IEnumerable嵌套協程
通常情況下,嵌套的協同程序可能是這個樣子:
void Start() { StartCoroutine(OuterCoroutine()); }
IEnumerator OuterCoroutine()
{
//Do Some Stuff . . .
yield return StartCoroutine(InnerCoroutine());
//Finish Doing Stuff . . .
}
IEnumerator InnerCoroutine()
{
//Do some other stuff . . .
yield return new WaitForSeconds(2f);
//Finish Doing that other stuff . . .
}
這一切很好,很好,但它真的沒有必要。相同的效果,可以實現這樣的:
void Start() { StartCoroutine(OuterCoroutine()); }
IEnumerator OuterCoroutine()
{
//Do Some Stuff . . .
IEnumerator innerCoroutineEnumerator = InnerCoroutine().GetEnumerator();
while(innerCoroutineEnumerator.MoveNext())
yield return innerCoroutineEnumerator.Current;
//Finish Doing Stuff . . .
}
IEnumerable InnerCoroutine()
{
//Do some other stuff . . .
yield return new WaitForSeconds(2f);
//Finish Doing that other stuff . . .
}
我發現這個方法產生較少的垃圾(其可以是在統一的一個問題),比具有多個StartCoroutines;因此它非常有用,特別是在處理很多嵌套圖層時。
現在我的問題是:
而不是使用IEnumerable InnerCoroutine(){}
並獲得像這樣的枚舉:
IEnumerator innerCoroutineEnumerator = InnerCoroutine().GetEnumerator();
我想使用IEnumerator InnerCoroutine(){}
,並得到這樣的枚舉:
IEnumerator innerCoroutineEnumerator = InnerCoroutine();
它們是一樣的嗎?
除了在我的測試中更快,此方法將允許我通過正常的StartCoroutine方法使用「內部協同程序」方法,這在方法上可能有用。
我已經完成了測試,並且據我所知,這兩種技術都有效地做了同樣的事情,但我在整個編碼方面還是比較新的,所以有機會我錯過了一些東西。
如果您打算手動遍歷枚舉數據塊的內容,那麼返回IEnumerable會很方便,但是再一次,它只是語法糖,因爲您可以使用一個while(iterator.MoveNext())實現與IEnumerator相同的結果{ }循環。一個不同之處在於,在使用foreach時,Dispose將確保在IEnumerable上爲您自動調用,而IEnumerator不具有相同的好處。目前尚不清楚何時或如何變得有用。 –