Rx의 주요 인터페이스 살펴보기
이 항목에서는 관찰 가능한 시퀀스를 나타내고 구독하는 데 사용되는 주요 Rx(Reactive Extensions) 인터페이스에 대해 설명합니다.
IObservable<T>/IObserver<T> 인터페이스는 .NET Framework 4.0 기본 클래스 라이브러리에서 사용할 수 있으며 Javascript뿐만 아니라 .NET 3.5, Silverlight 3 및 4에 설치할 수 있는 패키지로 제공됩니다.
IObservable<T>/IObserver<T>
Rx는 비동기 및 이벤트 기반 데이터 원본을 .NET Framework 4.0의 새 IObservable T> 인터페이스에 의해 추상화된 푸시 기반 관찰 가능한<시퀀스로 노출합니다. 이 IObservable<T> 인터페이스는 풀 기반 열거 가능한 컬렉션에 사용되는 친숙한 IEnumerable<T> 인터페이스의 이중 인터페이스입니다. 관찰할 수 있는 데이터 원본을 나타냅니다. 즉, 관심 있는 사람에게 데이터를 보낼 수 있습니다. 관심 있는 수신기를 나타내는 종속 IObserver<T> 구현 목록을 유지 관리하고 상태 변경 내용을 자동으로 알 수 있습니다.
IObservable<T 인터페이스의 구현은 T> 형식의 요소 컬렉션으로 볼 수 있습니다. 따라서 IObservable<int> 는 정수 컬렉션으로 볼 수 있으며, 정수는 구독된 관찰자에게 푸시됩니다.
Rx란?에 설명된 대로 푸시 모델의 나머지 절반은 구독을 통해 관심을 등록하는 관찰자를 나타내는 IObserver<T> 인터페이스로 표시됩니다. 항목은 이후에 구독하는 관찰 가능한 시퀀스에서 관찰자에게 전달됩니다.
관찰 가능한 컬렉션에서 알림을 받으려면 IObservable의 Subscribe 메서드를 사용하여 IObserver<T> 개체를 전달합니다. 이 관찰자에 대한 대가로 Subscribe 메서드는 구독에 대한 핸들 역할을 하는 IDisposable 개체를 반환합니다. 이렇게 하면 완료된 후 구독을 클린 수 있습니다. 이 개체에서 Dispose를 호출하면 알림이 더 이상 전달되지 않도록 관찰자가 원본에서 분리됩니다. 유추할 수 있듯이 Rx에서는 .NET 이벤트 모델과 같이 이벤트에서 명시적으로 구독을 취소할 필요가 없습니다.
관찰자는 인터페이스의 메서드에 반영된 세 가지 게시 이벤트를 지원합니다. 관찰 가능한 데이터 원본에 사용 가능한 데이터가 있는 경우 OnNext를 0번 이상 호출할 수 있습니다. 예를 들어 마우스 이동 이벤트에 사용되는 관찰 가능한 데이터 원본은 마우스가 이동할 때마다 Point 개체를 보낼 수 있습니다. 다른 두 메서드는 완료 또는 오류를 나타내는 데 사용됩니다.
다음은 IObservable<T>/IObserver<T> 인터페이스를 나열합니다.
public interface IObservable<out T>
{
IDisposable Subscribe(IObserver<T> observer);
}
public interface IObserver<in T>
{
void OnCompleted(); // Notifies the observer that the source has finished sending messages.
void OnError(Exception error); // Notifies the observer about any exception or error.
void OnNext(T value); // Pushes the next data value from the source to the observer.
}
또한 Rx는 IObserver<T> 인터페이스를 직접 구현하지 않도록 구독 확장 메서드를 제공합니다. 관찰 가능한 시퀀스의 각 게시 이벤트(OnNext, OnError, OnCompleted)에 대해 다음 예제와 같이 호출할 대리자를 지정할 수 있습니다. 이벤트에 대한 작업을 지정하지 않으면 기본 동작이 발생합니다.
IObservable<int> source = Observable.Range(1, 5); //creates an observable sequence of 5 integers, starting from 1
IDisposable subscription = source.Subscribe(
x => Console.WriteLine("OnNext: {0}", x), //prints out the value being pushed
ex => Console.WriteLine("OnError: {0}", ex.Message),
() => Console.WriteLine("OnCompleted"));
관찰 가능한 시퀀스(예: 마우스 오버 이벤트 시퀀스)를 일반 컬렉션인 것처럼 처리할 수 있습니다. 따라서 컬렉션에 LINQ 쿼리를 작성하여 필터링, 그룹화, 작성 등의 작업을 수행할 수 있습니다. 관찰 가능한 시퀀스를 더 유용하게 만들기 위해 Rx 어셈블리는 많은 팩터리 LINQ 연산자를 제공하므로 이러한 연산자를 직접 구현할 필요가 없습니다. LINQ 연산자를 사용하여 관찰 가능한 시퀀스 쿼리 항목에서 설명합니다.
경고
IObservable<T/IObserver<T>> 인터페이스를 직접 구현할 필요가 없습니다. Rx는 이러한 인터페이스의 내부 구현을 제공하고 Observable 및 Observer 형식에서 제공하는 다양한 확장 메서드를 통해 노출합니다. 자세한 내용은 관찰 가능한 시퀀스 만들기 및 쿼리 항목을 참조하세요.