【问题标题】:How to zip two publishers if the second one depends on the values received by the first one?如果第二个发布者取决于第一个发布者收到的值,如何压缩两个发布者?
【发布时间】:2021-01-19 23:06:47
【问题描述】:

创建模型所需的数据是拆分的,只能通过两个 API 请求接收。

第一个 (query.snapshotPublisher()) 发布者将获得模型的主要部分(包括它的 ID),第二个请求 (getPersonalLikeCount(blogModel: blogModel, userID: "408VYXScmxUtUQB91EoTf0LEMgj2")) 将获得一些额外的数据并需要 ID(这是模型的一部分)为什么我要传递从第一个请求中获得的完整模型)。

如果两个请求都是独立的,我将使用 .Zip(other: ) 运算符,但由于第二个依赖于第一个,我尝试了以下方法以将模型传递给第二个发布者。

但是通过这种方法,第二个发布者在发送第一个值后会被取消,因此即使getPersonalLikeCount 发布者获得新数据并应该再次发布它们也不会更新模型。

private func getBlogs(from query: Query) -> AnyPublisher<BlogModel, Error> {
    let publisher = query.snapshotPublisher()
        .flatMap { [self] blogModel -> AnyPublisher<(BlogModel, Int), Never> in
            let blogModelPublisher = Just(blogModel)
            let likeCountPublisher = getPersonalLikeCount(blogModel: blogModel, userID: "408VYXScmxUtUQB91EoTf0LEMgj2")
            let combined = Combine.Publishers.Zip(blogModelPublisher, likeCountPublisher)
            return combined.eraseToAnyPublisher()
        }
        .map { blogModel, personalLikeCount -> BlogModel in
            var newModel = blogModel
            newModel.personalLikeCount = personalLikeCount
            return newModel
        }
        .eraseToAnyPublisher()
    return publisher
}

【问题讨论】:

    标签: swift combine


    【解决方案1】:

    如果你想用一个新的请求重新启动一个请求,则语义上你使用map,后跟switchToLatest。当且仅当您想并行执行操作时,您才使用flatMap。奇怪的是,Combine 没有 concatMap,您可以使用它在其他反应式框架中连续执行任务。在你的情况下它的

    1. 发出第一个请求
    2. 映射到第二个请求
    3. 将两个值映射到一个元组中
    4. SwitchToLatest
    5. 将元组映射到您的结果中
    doTheFirstThingPublisher
     .map { firstValue in 
       doTheSecondThingPubisher(with: firstValue)
         .map { secondValue in (firstValue, secondValue) }
     }
     .switchToLatest()
     .map { firstValue, secondValue in
       makeFinalValue(from: firstValue, and: secondValue)
      }
    

    【讨论】:

    • 感谢您的回答。但是当使用这种方法时,我只收到第一个发布者发送的第一个值,而其他值在第一个 map 运算符之前被卡住。我应该提到两个出版商都是重复出版商。
    • 然后将第一张地图更改为平面地图,然后将开关移至最新。这将进行合并,但合并很危险,因为您需要注意可能创建的订阅数量的上限。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多