2016-05-19 9 views
0

Aufgrund des Verhaltens von start() können verschiedene Signale, die vom Producer erstellt werden, möglicherweise eine andere Version von Events sehen. Die Ereignisse können in einer anderen Reihenfolge zwischen den Signalen ankommen, oder der Stream könnte völlig anders sein!ReactiveCocoa SignalProducer Erläuterung

Beliebiges Beispiel zu obiger Aussage?

Antwort

1

Dies spricht nur für die asynchrone Natur von FRP und RAC. Ein Beispiel wäre, große Datenmengen von einer API zu holen und etwas mit den Antworten zu tun.

dies ist der Zweck der flatMap und die FlattenStrategy Methoden (.Latest finden Sie die Daten in der Reihenfolge bekommen es in kommt, .Concat Auftrag erhalten wird)

Ein Beispiel wäre ein Array von Objekten werden abruft. .Latest wird jedes Objekt zurückgeben, so wie es empfangen wird. .Concat wird das Array von Objekten in der ursprünglichen Reihenfolge zurückgeben. Wenn ein Objekt lange zum Herunterladen benötigt, wartet das System darauf, bevor es zu den anderen Objekten weitergeht.

Ein weiteres Beispiel einige JSON wird immer und Handhabung es entsprechend:

func getData() -> SignalProducer<NSDictionary, NSError> { 
     return SignalProducer { observer, _ in 
       let data = someAsyncNetworkRequestFuncThatReturnsJSON() 
       let newData = unpackJSONToDict(data) 
       observer.sendNext(newData) 
       observer.sendCompleted() 
      } 
      .flatMap(FlattenStrategy.Latest, transform: dataHandler) 
    } 

    func unpackJSONToDict(data: JSON) -> NSDictionary { 
     /// deal with JSON data and return desired data as NSDictionary 
    } 

    func dataHandler(dict: NSDictionary) -> SignalProducer<NSDictionary, NSError> { 
     /// do something with dict 
    } 
1

ein SignalProducer vorstellen, das eine Netzwerkanfrage an http://www.timeapi.org/utc/now erzeugt, analysiert die Zeit-String in einen NSDate, und sendet diese NSDate auf dem erzeugten Signal.

func getTimeSignal() -> SignalProducer<NSDate, NetworkError> { 
    return SignalProducer { sink, disposable in 
    let request = new Request("http://www.timeapi.org/utc/now") 
    Client().performRequest(request) { result in 
     switch result { 
     case let .Failure(error): 
      sink.sendFailed(error) 
     case let .Success(timeString): 
      sink.sendNext(parseDate(timeString)) 
      sink.sendCompleted() 
     } 
    } 
    } 
} 

Da die SignalProducer hat Nebenwirkungen - in diesem Fall die Netzwerkanforderung, die unterschiedlichen Daten angezeigt werden kann, wenn zu verschiedenen Zeiten ausgeführt werden, und auch zufällig ausfallen könnte, wenn die Verbindung unterbrochen ist oder der timeAPI Server war zum Absturz - Die Signale, die erzeugt werden, wenn start() aufgerufen wird, sehen eine andere Zeitleiste der Ereignisse!