ReactiveCocoa SignalProducer说明

时间:2016-05-19 07:17:55

标签: reactive-cocoa reactive-cocoa-4

  

由于start()的行为,从中创建了不同的Signals   制作人可能会看到不同版本的事件。活动可能会到来   信号之间的顺序不同,或者流可能是   完全不同!

以上陈述的任何例子?

2 个答案:

答案 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()时会产生不同的事件时间表!