2016-02-25 15 views
5

Czuję, że rozumiem wszystkie podstawowe składniki ReactiveCocoa (koncepcyjnie), przez zrozumienie, jak połączyć wszystkie kawałki razem, jest jeszcze trochę mylące.Dlaczego SignalProducer nie zwraca sygnału?

Na przykład, po przeczytaniu o Signal, w pełni oczekuje SignalProducer po prostu mieć metodę jeden start(), która zwracana jest sygnał, który należałoby użyć tak:

mySignalProducer.start().observe(myObserver) 

Zamiast tego trzeba zdać obserwator na start(), a SignalProducer rozmowy obserwować() dla Ciebie:

mySignalProducer.start(myObserver) 

oznacza to, że interfejs SignalProducer jest znacznie większe (bardziej do zrozumienia), ponieważ wszystkie wariacje na obserwacji() muszą być duplikowane przy starcie() (np. startNext(), etc).

Myślę, że są dwie możliwości tutaj:

  1. Istnieją powody techniczne dlaczego start() nie można po prostu wrócić sygnał
  2. ja rozumieją SignalProducer koncepcyjnie, co prowadzi do wonky oczekiwań jego interfejs

Jeśli chodzi o 1, przypuszczam, że ma to coś wspólnego z zarządzaniem pamięcią i dyskami jednorazowymi, których jeszcze nie rozumiem.

Bardziej martwię się, że tak jest 2. Wewnętrznie, moje rozumienie SignalProducer jest w zasadzie odwzorowywane do koncepcji fabryce, np .:

mySignalFactory.createSignal().observe(myObserver) 

dlatego jestem zaskoczony, że nie znaleźć start(), która zwraca sygnał.

Byłbym niezwykle wdzięczny, gdyby społeczność mogła rzucić trochę światła tutaj.

Dzięki!

Odpowiedz

5

Myślę, że głównym powodem jest to, że niektóre zdarzenia mogą być wysyłane natychmiast po uruchomieniu producenta.

Na przykład, jeśli nie podoba mi się interfejs serii Start, a chcą uzyskać sygnał bezpośrednio podczas startu:

extension SignalProducer { 
    func getSignalFromStart() -> Signal<Value, Error> { 
     var signal: Signal<Value, Error>! 
     startWithSignal{ innerSignal, _ in 
      signal = innerSignal 
     } 
     return signal 
    } 
} 

Następnie można pominąć niektóre zdarzenia. Wypróbuj to:

// When property.producer starts, it will send its current value immediately 
let property = MutableProperty(1) 

property.producer.getSignalFromStart().observeValues { value in 
    print("getSignalFromStart \(value)") // maybe not what you want, only gets 2 
} 

property.producer.startWithValues { value in 
    print("normal start \(value)") // this normally gets 1 and 2 
} 

property.value = 2 
Powiązane problemy