2016-05-19 8 views
0

start()の動作のため、 プロデューサから作成された異なる信号に、異なるバージョンのイベントが表示されることがあります。イベントは信号間で異なる順序で に到着する可能性があります。ストリームが完全に異なる である可能性があります。ReactiveCocoa SignalProducer説明

上記の例とは何ですか?

答えて

1

これは、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 
    } 
1

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()が呼び出されたときに生成される信号には、異なるタイムラインのイベントが表示されます。