2013-06-06 13 views

Odpowiedz

7

Prosta odpowiedź - użyj ToObservable. Po to jest to.

"Odpowiadając na rzeczywiste pytanie" odpowiedź - można uniknąć stosując Subjects poprzez Observable.Create:

void Main() 
{ 
    var src = Enumerable.Range(0, 10); 
    var observable = Observable.Create<int>(obs => 
    { 
     foreach(var item in src) 
     { 
      obs.OnNext(item); 
     } 
     return Disposable.Create(()=>{}); 
    }); 

    using(observable.Subscribe(Console.WriteLine)) 
    { 
     Console.ReadLine(); 
    } 
} 

wyjściowa:

0 
1 
2 
3 
4 
5 
6 
7 
8 
9 
+0

Czy 'Disposable.Create (() => {});' różni się od 'Disposable.Empty'? – interlude

+1

@interlude Nie bardzo, użyłem przeciążenia, więc można dodać logikę czyszczenia, jeśli jest to wymagane. – JerKimball

1

Jeśli ktoś ma IEnumerable nieznanego typu, istnieją dwa sposoby, jeden może "przekonwertować go do IObservable":

  • Skopiuj wszystkie dane w obiekcie do nowej kolekcji, która implementuje IObservable. Jeśli tak się stanie, zostaną zgłoszone tylko zmiany wprowadzone do nowej kolekcji. Zmiany dokonane w oryginale nie będą.

  • Utwórz nowy obiekt, który będzie okresowo robić migawki zawartości IEnumerable; po zrobieniu każdej migawki, zgłoś wszystkie zmiany, które musiałyby zostać wprowadzone w poprzedniej migawce, aby pasowała do nowej. Dzięki temu podejściu, zmiany wprowadzone do oryginalnego obiektu zostaną zauważone, ale trudno jest zapewnić terminowe powiadomienia o aktualizacjach, nie tracąc wiele czasu na wielokrotne odczytywanie kolekcji, gdy nic się nie zmieni.

Istnieje kilka razy, gdy trzeba mieć IObservable związany z oryginalnym IEnumerable obiektu, zamiast do nowego obiektu, który jest fabrycznie napełniony z kopią danych; w takich przypadkach może być konieczne zastosowanie drugiego podejścia. Często jednak nie będzie możliwe szybkie wprowadzenie szybkości odpytywania, aby zapewnić terminowe aktualizacje bez powodowania niedopuszczalnego ładowania systemu, chyba że oryginalna kolekcja obsługuje funkcje, które nie są dostępne w arbitralnym IEnumerable. Ponadto, jeśli nie zostanie nałożony wymóg dotyczący typu modelu IEnumerable, prawdopodobnie będzie konieczne wprowadzenie ograniczeń w kontekście wątków, w których może on zostać zaktualizowany.

Powiązane problemy