gpt4 book ai didi

swift - RxSwift - 映射后函数的调用顺序

转载 作者:行者123 更新时间:2023-11-28 07:43:44 25 4
gpt4 key购买 nike

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

这是一个示例代码:

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(_:) 预计仅在我们检索更新后的数据流后才会被调用。通过上述实现,在数据映射到新值之前首先调用 attachUpdatedData(_:)。有人可以指出我正确的方向吗?

最佳答案

平面 map

可能您可以使用 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)

关于swift - RxSwift - 映射后函数的调用顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51531589/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com