【问题标题】:ReactiveCocoa SignalProducer ExplanationReactiveCocoa SignalProducer 解释
【发布时间】:2016-05-19 07:17:54
【问题描述】:

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

以上陈述有什么例子吗?

【问题讨论】:

    标签: reactive-cocoa reactive-cocoa-4


    【解决方案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
        }
    

    【讨论】:

      【解决方案2】:

      想象一个 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() 时会产生不同的事件时间线!

      【讨论】:

        猜你喜欢
        • 2015-09-02
        • 2015-08-19
        • 1970-01-01
        • 2016-04-12
        • 1970-01-01
        • 2014-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多