在 SwiftUI 中使用 Combine 进行映射、捕获错误和分配
Posted
技术标签:
【中文标题】在 SwiftUI 中使用 Combine 进行映射、捕获错误和分配【英文标题】:Map, catch error and assign with Combine in SwiftUI 【发布时间】:2021-07-30 11:22:43 【问题描述】:我学习使用 Combine 并编写了以下代码:
serviceAgent.podcasts()
.sink(
receiveCompletion: cpl in
switch cpl
case .failure(let error):
print(error.localizedDescription)
case .finished:
return
,
receiveValue: [weak self] (model) in
self?.items = model.map( podcast in
let item = PodcastCardItemViewModel(podcast)
item.clickPublisher.sink value in
self?.clickPublisher.send(value)
.store(in: &(self!.cancelBag))
return item
)
).store(in: &cancelBag)
我很确定可以使用 map、catch 和 assign 来简化此代码,但我不知道如何。 有什么想法吗?
谢谢
【问题讨论】:
【参考方案1】:高级组合
这是结合使用的一些难点。但这是可行的。如果没有看到您的其余代码,我不知道这是否会 100% 正确工作。但我能够在我的机器上编译它。
serviceAgent
.podcasts()
.map(PodcastCardItemViewModel.init)
.flatMap $0.clickPublisher
.collect()
.eraseToAnyPublisher()
.sink(
receiveCompletion: cpl in
switch cpl
case .failure(let error):
print(error.localizedDescription)
case .finished:
return
,
receiveValue: [weak self] value in
self?.clickPublisher.send(value)
).store(in: &cancelBag)
【讨论】:
我希望避免使用水槽 使用combine,您必须在某个时候解析管道。接收或订阅。那就是执行功能。如果您希望接收器发生在其他地方,您可以在另一个.map
中发送,并从函数中返回生成的发布者以便在其他地方接收。以上是关于在 SwiftUI 中使用 Combine 进行映射、捕获错误和分配的主要内容,如果未能解决你的问题,请参考以下文章
使用 Combine 和 SwiftUI 在 Realm 中观察收集结果
如何使用 Combine 框架和 SwiftUI 发布网络请求的数据
如何使用 Combine 的 CurrentValueSubject 并在 SwiftUI 视图中访问它?
使用 SwiftUI/Combine,如何避免在 ViewModel 中放置可取消项