Tak jak pisałem we wcześniejszych częściach ([RX 1], [RX 2], [RX 3], [RX 4]), Reactive Extensions dla .NET oferują mnóstwo pomocniczych rozszerzeń pozwalających na proste tworzenie obserwowalnych kolekcji.
Przyjrzyjmy się tym najbardziej podstawowym.
Najprymitywniejsze kolekcje obserwowalne
Poniższa tabela przedstawia najprymitywniejsze (lub inaczej najprostsze) kolekcje obserwowalne. Dla każdego przykładu oprócz funkcji generującej obserwowalną kolekcję, podano również odpowiednik w postaci kolekcji, która mogłaby być przeglądana w sposób "klasyczny", przez zwykły iterator.
Funkcja RX |
Przykład RX |
Komentarz |
Reprezentacja graficzna |
Kolekcja klasyczna |
Przykład dla kolekcji klasycznej |
Observable.Empty<T>() |
Observable.Empty<int>() |
Obserwowalna kolekcja informuje, że już jest skończona. |
Pusta tablica. |
new int[0] |
|
Observable.Return<T>(T element) |
Observable.Return(777) |
Obserwowalna kolekcja zwraca jeden element i informuje, że już jest skończona. |
Tablica jednoelementowa. |
new int[]{777} |
|
Observable.Throw<T> (Exception e) |
Observable.Throw<int> (new Exception("msg")) |
Obserwowalna kolekcja informuje o tym, że miał miejsce błąd. |
Iterator rzuca Exception. |
|
|
Observable.Never<T>() |
Observable.Never<int>() |
Obserwowalna kolekcja o niczym nie informuje. |
Iterator zawiesił się. |
|
|
Observable.Range(begin, end) |
Observable.Range(0,2) |
Obserwowalna kolekcja zwraca wartości z pewnego zakresu i informuje, że już jest skończona. |
Kolekcja (np. Tablica) z zakresem wartości. |
Enumerable.Range (0,2) |
|
Observable.Interval ( TimeSpan t); |
Observable.Interval ( TimeSpan.FromMilliseconds (100)); |
Nowa wartość co pewien czas. |
|
Nowa wartość co pewien czas. |
Nowa wartość co 100 ms |
Przedstawione powyżej metody tworzenia obsesjonalnych są bardzo proste, ale można je traktować jako komponenty (lub też składowe) służące do budowy bardziej skomplikowanych kolekcji (kompozycji będzie poświęcony osobny wpis na blogu).
ToObserwable
Funkcja rozszerzająca "ToObservable" jest najprostszym sposobem na zamianę "zwykłej" kolekcji, na kolekcję obserwowalną. Wystarczy na kolekcji (np. na tablicy) wywołać rozszerzenie ToObservable, by uzyskać obiekt spełniający interfejs IObservable. Przykład wykorzystania podawany był już wcześniej we wpisie p.t.: "Reactive Extensions pierwszy kontakt z kodem (czyli artykułu cz. 3)".
Observable.Generate
Observable.Generate pozwala na wygenerowanie obserwowalnej kolekcji w postaci sekwencji, która iterowana jest tak długo, aż pewien warunek przestanie być spełniany. Dla przykładu zauważmy, że kolekcja obserwowalna wytworzona przez kod:
Observable.Generate( 0, i => i < 10, i => i + 1, i => i);
Będzie odpowiadała kolekcji tradycyjnej wytworzonej przez:
for(int i=0;i<10;i++) yield return i;
Dostępna jest również odmiana funkcji Generate, w której jednym z parametrów jest przedział czasowy, ustawienie którego spowoduje, że kolejne elementy będą generowane co wskazany czas.
Observable.Create
Observable.Create pozwala na najbardziej elastyczne tworzenie kolekcji obserwowalnej. Do funkcji tej przekazujemy delegat o parametrze IObservable, następnie działamy na przekazanej instancji obiektu wspierającego IObservable, by na końcu zwrócić delegat, który będzie wykonany w momencie Dispose. Dla przykładu, poniższy kod wytworzy kolekcję obserwowalną zwracającą jeden element (liczbę 77) i kończącą się (w momencie Dispose nic nie zostanie wykonane):
Observable.Create<int>( observer => { observer.OnNext( 77 ); observer.OnCompleted(); return ( () => { } ); } );
Podsumowanie
Reasumując, Reactive Extension dla .NET, dostarcza wiele funkcji wspierających tworzenie obserwowalnych kolekcji, wśród których wymienić należy: Empty, Return, Throw, Never, Range, Interval, Generate, Create.
Tych, których nie znudziła ta kolejna, dość teoretyczna część, zapraszam do przeczytania już wkrótce kolejnych części artykułu.
Brak komentarzy:
Prześlij komentarz