由于start()的行为,从中创建了不同的Signals 制作人可能会看到不同版本的事件。活动可能会到来 信号之间的顺序不同,或者流可能是 完全不同!
以上陈述的任何例子?
答案 0 :(得分:1)
这只是谈到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
}
答案 1 :(得分: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()
时会产生不同的事件时间表!