【发布时间】:2016-05-19 07:17:54
【问题描述】:
由于 start() 的行为,从 生产者可能会看到不同版本的事件。事件可能会到来 信号之间的顺序不同,或者流可能是 完全不同!
以上陈述有什么例子吗?
【问题讨论】:
标签: reactive-cocoa reactive-cocoa-4
由于 start() 的行为,从 生产者可能会看到不同版本的事件。事件可能会到来 信号之间的顺序不同,或者流可能是 完全不同!
以上陈述有什么例子吗?
【问题讨论】:
标签: reactive-cocoa reactive-cocoa-4
这只是说 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() 时会产生不同的事件时间线!
【讨论】: