【发布时间】:2020-08-19 18:25:42
【问题描述】:
我正在尝试获取 EventDetailsModel 的初始值并订阅所有未来的更新。
当我调用eventDetails(..) 时,所有发布者都已经有了一些当前值(即chatModels 和userModels 有10 多个项目);问题是因为没有新的更新,所以生成的管道永远不会返回 EventDetailModels,因为 .map(...) 永远不会被调用。
如何让组合管道在构建时至少通过现有值一次,以便我的接收器具有一些初始值?
var chatModels: Publishers.Share<CurrentValueSubject<[ChatModel], Never>> = CurrentValueSubject([]).share()
var userModels: CurrentValueSubject<[String: UserModel], Never> = CurrentValueSubject([:])
func eventDetails(forChatId chatId: String) -> AnyPublisher<EventDetailsModel?, Never> {
return chatModels
.combineLatest(userModels)
.map({ (chatList, userModels) -> EventDetailsModel? in
// Never gets called, even if chatModels and userModels has some existing data ????
if let chatModel = (chatList.first { $0.id == chatId}) {
return EventDetailsModel(chatModel, userModels)
}
return nil
})
.eraseToAnyPublisher()
}
【问题讨论】:
-
第二个问题大致相同。也许,与其问如何使这个特定的事情发挥作用,不如扩大问题范围以描述您实际想要实现的目标。
-
@NewDev 是的,这可能是一个 x-y 问题。我的猜测是,OP 真正想要的只是使用
chatModels作为发布者,然后是添加userModels的flatMap。但如果没有关于目标的实际信息,就不可能说出来。 -
@matt 更新了更高级别的目标,我几乎想获取一个初始值并听取后续更新。问题是我得到了后续更新,但没有得到初始值。
-
好的,刚刚注意到
chatModels是Publishers.Share,不知道这是否改变了语义。 -
主题不需要
.share。无论如何,主题都是引用类型