【问题标题】:RxSwift - call sequence of a function after MappingRxSwift - 映射后函数的调用序列
【发布时间】:2018-07-26 05:27:37
【问题描述】:

我试图在成功完成映射后调用一个函数。 可观察对象是通过映射从现有流创建的。在映射块内,我订阅以获取映射到最终类型的输出。使用更新的流,我正在考虑调用该函数。但是该函数在我订阅并将其映射到更新的流之前被调用。

这是一个示例代码:

let updatedDataStream = dataStream
            .observeOn(MainScheduler.instance)
            .map { (data) -> ViewData? in

            guard var unknownData = data as? UnknownDataType,
                let location = unknownData.dataPoints.first?.location else  {
                    return data
                }

                let dataModel = DataModel(x: location.x, y: location.y)

                self.dataStore.localStore?
                    .entity(forID: DataModel.entityID)
                    .filter({$0?.status == .Success})
                    .take(1)
                    .unwrap()
                    .subscribe(onNext: { (localDataModel) in

                        guard let value = localDataModel.dataValue, value.count > 0 else {
                            return
                        }

                        unknownData.value = value

                    }).disposed(by: self.disposeBag)
                return unknownData
        }

        self.attachUpdatedData(updatedDataStream)

attachUpdatedData(_:) 预计只有在我们检索到 updatedDataStream 后才会被调用。通过上面的实现,attachUpdatedData(_:) 在数据映射到新值之前首先被调用。有人能指出我正确的方向吗?

【问题讨论】:

    标签: swift reactive-programming rx-swift


    【解决方案1】:

    在地图中订阅(或任何转换,就此而言)是一个禁忌。您将对“dataStream”中的每个项目创建一个新订阅,并且基本上失去对数据流的所有控制。此外,在执行 'onNext:' 之前,'unknownData' 很可能会从 '.map()' 返回。

    你想达到什么目的?

    【讨论】:

      【解决方案2】:

      平面地图

      您可能会使用flatMap 而不是map

      let updatedDataStream = dataStream
          .observeOn(MainScheduler.instance)
          .flatMap /* or flatMapLatest */ { [weak self] /* avoid memory leak */ data -> ViewData? in
            guard var unknownData = data as? UnknownDataType,
                      let location = unknownData.dataPoints.first?.location,
                      let self = self else
            { return .just(data) }
      
            let dataModel = DataModel(x: location.x, y: location.y)
            return self.dataStore.localStore?
                          .entity(forID: DataModel.entityID)
                          .filter({$0?.status == .Success})
                          .take(1)
                          .unwrap()
                          .map { localDataModel in
                             guard let value = localDataModel.dataValue,
                                   value.count > 0 else { 
                             return .just(unknownData)
                             }
                             unknownData.value = value
                             return unknownData
                           }
             }
             self.attachUpdatedData(updatedDataStream)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-13
        • 2011-07-08
        • 1970-01-01
        • 2013-06-25
        • 2023-04-01
        相关资源
        最近更新 更多