在 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 中放置可取消项

SwiftUI + Combine:如何将数据分配给带有动画的模型

使用 Combine 和 SwiftUI 显示变化值的最简洁方式是啥?