由于 start() 的行为,从生产者创建的不同信号可能会看到不同版本的事件。信号之间的事件可能以不同的顺序到达,或者流可能完全不同!
上述陈述的任何例子?
由于 start() 的行为,从生产者创建的不同信号可能会看到不同版本的事件。信号之间的事件可能以不同的顺序到达,或者流可能完全不同!
上述陈述的任何例子?
这只是说 FRP 和 RAC 的异步性质。一个例子是从 API 中获取大量数据并对响应进行处理。
这是目的flatMap
和FlattenStrategy
方法(.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
}
想象一个 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()
被调用会看到不同的事件时间线!