我试图创建一个函数,它将返回一个结构体,该结构体是由合并调用链中的两个发布者构造的,类似于下面的伪代码
struct UpdatedPilotsInfo {
let pilots: [JSON]
let squad: JSON
}
func buildInfoIdeal() {
func processPilots(squad: JSON) -> AnyPublisher<[JSON] , XWSImportError> { ... }
func loadSquad() -> AnyPublisher<JSON, XWSImportError> { ... }
let squadInfoPublisher: AnyPublisher<(JSON, [JSON]), XWSImportError> = JSONSection
.SquadService_XWSImport_New
.SquadService
.loadSquad() // AnyPublisher<JSON, XWSImportError>
.flatMap(processPilots) // AnyPublisher<[JSON], XWSImportError>
.??? // AnyPublisher<(JSON, [JSON]), XWSImportError>
.map{ tuple -> UpdatedPilotsInfo in
return UpdatedPilotsInfo(squad: tuple.0, pilots: tuple.1)
}.eraseToAnyPublisher()
}
我的问题是,我不知道如何才能让一个上游出版商创建在链的顶端(loadSquad
)。在上面的示例中,我将loadSquad()
的输出传递给processPilots()
,并希望根据loadSquad()
和processPilots()
的结果构建UpdatedPilotsInfo
。我想我可以通过执行以下操作来实现这一点,但我希望使用一个简单的链来代替所有这些代码:
func buildInfo() -> AnPublisher<UpdatedPilotsInfo, XWSImportError> {
func processPilots(squad: JSON) -> AnyPublisher<[JSON] , XWSImportError> { ... }
func loadSquad() -> AnyPublisher<JSON, XWSImportError> { ... }
let squadPublisher: AnyPublisher<JSON, XWSImportError> = JSONSection
.SquadService_XWSImport_New
.SquadService
.loadSquad() // AnyPublisher<JSON, XWSImportError>
.eraseToAnyPublisher()
let updatedPilots: AnyPublisher<[JSON], XWSImportError> = squadPublisher
.flatMap{ [weak self] squad -> AnyPublisher<[JSON], XWSImportError in
let s = self
return s.processPilots(squad)
}
.eraseToAnyPublisher()
let zip = Publishers.Zip(squadPublisher, updatedPilots)
.eraseToAnyPublisher() // AnyPublisher<(JSON, [JSON]), XWSImportError>
return zip.map{ tuple -> UpdatedPilotsInfo in
return UpdatedPilotsInfo(squad: tuple.0, pilots: tuple.1)
}.eraseToAnyPublisher()
}
这是我可以用现有的操作符完成的,还是我需要创建一个自定义操作符?
2条答案
按热度按时间q3qa4bjr1#
据我所知,你有两个发布器,你想把它们组合起来,这样当两个发布器都收到输出时,一个结构就被创建了?
我试图在Playground中创建一个与您的问题非常相似的示例。
希望我能帮到你。
ldfqzlk82#
请记住,
.flatMap { Just($0) }
和.map { $0 }
是完全相同的,而且都是无操作的。这意味着您可以使用传递参数,同时将其与其他执行某些实际工作的发布者组合。
因此,通过上面的操作,我们将来自
loadSquad
的响应与来自flatMap
内部的processPilots
的响应一起传递。