오르카의 아틀리에

 

개인 프로젝트를 하던 중, 다음과 같은 에러를 만났습니다.

InvalidOperationException: sequence is empty
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () (at <7d97106330684add86d080ecf65bfe69>:0)
UniRx.InternalUtil.ExceptionExtensions.Throw (System.Exception exception) (at Assets/Plugins/UniRx/Scripts/InternalUtil/ExceptionExtensions.cs:10)
UniRx.Stubs+<>c.<.cctor>b__3_1 (System.Exception ex) (at Assets/Plugins/UniRx/Scripts/Observer.cs:496)
UniRx.Observer+Subscribe1[T].OnError (System.Exception error) (at Assets/Plugins/UniRx/Scripts/Observer.cs:173) UniRx.Operators.FirstObservable1+First[T].OnCompleted () (at Assets/Plugins/UniRx/Scripts/Operators/First.cs:83)
UniRx.Operators.WhereObservable1+Where[T].OnCompleted () (at Assets/Plugins/UniRx/Scripts/Operators/Where.cs:101) UniRx.Operators.TakeUntilObservable2+TakeUntil+TakeUntilOther[T,TOther].OnNext (TOther value) (at Assets/Plugins/UniRx/Scripts/Operators/TakeUntil.cs:84)
UniRx.InternalUtil.ListObserver1[T].OnNext (T value) (at Assets/Plugins/UniRx/Scripts/InternalUtil/ListObserver.cs:39) UniRx.Subject1[T].OnNext (T value) (at Assets/Plugins/UniRx/Scripts/Subjects/Subject.cs:62)
UniRx.Triggers.ObservableEnableTrigger.OnDisable () (at Assets/Plugins/UniRx/Scripts/UnityEngineBridge/Triggers/ObservableEnableTrigger.cs:28)

 

스택에 First.cs:83가 찍힌걸 보니 First를 사용한 곳에서 OnCompleted가 흐를 때 뭔가 문제가 있나 봅니다.

 

관련된 부분의 코드입니다.

try { observer.OnError(new InvalidOperationException("sequence is empty")); }

이 부분에서 에러가 나는 걸 보니, notPublished가 true인가 봅니다. First()를 사용한 스트림은 스트림에 데이터가 한 번도 발행되지 않으면 OnCompleted()가 호출되는 것이 아니라 OnError()가 호출되게 되어있습니다.

 

음... 좋지 못하네요. 일단 지금 진행하는 프로젝트에서는 별 문제가 없지만 console에 빨간 줄이 뜨는 것이 정말 걸리적거립니다. First를 대체하면서도, 해당 상황에서도 잘 OnCompleted를 호출하는 방법은 없을까요?

 

소스 스트림에 흐르는 n개의 데이터만 취하겠다는 Take(n) 오퍼레이터를 사용하면 됩니다. Take(1)을 이용한다면 최초 1개의 데이터만 받게 되겠죠? 그럼 Take()의 OnCompleted 구현부를 살펴봅시다.

 

심플하네요. 딱히 OnComplete가 안 불릴 경우가 없는 것 같습니다. 저는 Take(1)으로 대체해서 더 이상 에러 로그가 뜨지는 않습니다만, 코드의 의도에 따라서 First()를 사용할지 Take(1)을 사용할지 고민해보셔야될 것같습니다.