0

由于 start() 的行为,从生产者创建的不同信号可能会看到不同版本的事件。信号之间的事件可能以不同的顺序到达,或者流可能完全不同!

上述陈述的任何例子?

4

2 回答 2

1

这只是说 FRP 和 RAC 的异步性质。一个例子是从 API 中获取大量数据并对响应进行处理。

这是目的flatMapFlattenStrategy方法(.Latest将按照数据进入的顺序为您获取数据,.Concat将保持顺序)

一个例子是检索一个对象数组。.Latest将在收到每个 obj 时返回它。.Concat将以原始顺序返回对象数组。如果一个对象需要很长时间才能下载,系统将在继续下载其他对象之前等待它。

另一个例子是获取一些 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
    }
于 2016-05-31T18:57:17.657 回答
1

想象一个 SignalProducer,它创建一个对http://www.timeapi.org/utc/now的网络请求,将时间字符串解析为 NSDate,并在生成的 Signal 上发送该 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()被调用会看到不同的事件时间线!

于 2016-10-11T00:01:45.503 回答