start()の動作のため、 プロデューサから作成された異なる信号に、異なるバージョンのイベントが表示されることがあります。イベントは信号間で異なる順序で に到着する可能性があります。ストリームが完全に異なる である可能性があります。ReactiveCocoa SignalProducer説明
上記の例とは何ですか?
start()の動作のため、 プロデューサから作成された異なる信号に、異なるバージョンのイベントが表示されることがあります。イベントは信号間で異なる順序で に到着する可能性があります。ストリームが完全に異なる である可能性があります。ReactiveCocoa SignalProducer説明
上記の例とは何ですか?
これは、FRPとRACの非同期性に関係しています。例としては、APIから大量のデータを取り出し、その応答で何かをすることです。
これはflatMap
の目的であるとFlattenStrategy
方法(.Latest
はあなたにそれが入ってくる順序でデータを取得する、.Concat
は順序を保持します)
の例では、オブジェクトの配列を取得することになります。 .Latest
は、受け取った各objを返します。 .Concat
は、元の順序でオブジェクトの配列を返します。 1つのオブジェクトのダウンロードに時間がかかる場合、システムは他のオブジェクトに進む前に待機します。
別の例は、いくつかのJSONを取得し、それを適切に処理している:
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
}
はhttp://www.timeapi.org/utc/nowへのネットワーク要求を作成SignalProducerを想像し、NSDateに時刻文字列を解析し、生成された信号にそのNSDateを送信します。
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()
}
}
}
}
SignalProducerは副作用があるので - この場合には、異なる時間に実行された場合に異なるデータが返されますネットワーク要求を、との接続がダウンしたかtimeAPIサーバーがクラッシュした場合にも、ランダムに失敗する可能性があります - start()
が呼び出されたときに生成される信号には、異なるタイムラインのイベントが表示されます。