美文网首页
Combine 通过 PassthroughRelay 的数据发

Combine 通过 PassthroughRelay 的数据发

作者: 大成小栈 | 来源:发表于2025-01-01 17:44 被阅读0次

在这个ViewModel代码中,allCreations、allCreationsRelay 和 allCreationsPublisher 是三个关联但作用不同的变量。


// 变量 allCreations
private var allCreations: [CreationModel] = []

// 变量的PassthroughRelay
private let allCreationsRelay = PassthroughRelay<[CreationModel]>()

// 变量对应的AnyPublisher
var allCreationsPublisher: AnyPublisher<[CreationModel], Never> {
   allCreationsRelay.eraseToAnyPublisher()
}

------------------------------

// 订阅
allCreationsPublisher
                .map({ $0.filter({ $0.isDot }).count })
                .removeDuplicates()
                .sink(receiveValue: { [weak self] count in
                    self?.dotNumber = count
                }).store(in: &cancellables)
  • allCreations:
    这是一个普通的数组,类型为 [CreationModel],它存储了所有的作品数据;

  • allCreationsRelay:
    allCreationsRelay 是一个 PassthroughRelay<[CreationModel]>,它是一个 Combine 的专用对象,用来“传递”数据;

  • allCreationsPublisher:
    allCreationsPublisher 是 allCreationsRelay.eraseToAnyPublisher() 的结果,它将 allCreationsRelay 转换为一个可以公开订阅的 Publisher。

为什么不能直接订阅allCreationsRelay?

针对 allCreationsRelayallCreationsPublisher 的存在意义:两个变量之间的关系实际上是通过 PassthroughRelayAnyPublisher 来实现的。

  1. PassthroughRelay 的作用
    allCreationsRelay 是一个 PassthroughRelay<[CreationModel]>,这实际上是一个对象,它用于在内部管理数据流。PassthroughRelay 是一个特殊的类型,它结合了 PassthroughSubjectRelay 的特性,允许我们发布一个事件流,但它本身并不遵循公开发布的规范,不能直接作为公共 API 使用。

  2. 封装和数据流控制
    allCreationsRelay 只是一个底层的容器,充当了对外界通知的角色。为了提供更强的封装性、解耦和可测试性,我们通常会暴露一个 AnyPublisher 类型的数据流,而不是直接暴露一个 PassthroughRelay 对象。通过暴露 allCreationsPublisherAnyPublisher<[CreationModel], Never>),外部只能订阅这个封装后的流,而不需要关心它如何被更新。这样做符合封装和数据流的控制原则。

  3. AnyPublisher 的意义
    allCreationsPublisher 是一个通过 .eraseToAnyPublisher() 封装的 AnyPublisher,它是 PassthroughRelay 公开的接口。AnyPublisher 封装了 PassthroughRelay,让外部只能订阅、观察这个流,而不能修改它。这种方式可以保证外部只能读取数据,而不会意外修改它,增加了代码的健壮性。

allCreationsRelay 是一个内部的可变数据流,供内部使用来发布数据变更;
allCreationsPublisher 是一个对外公开的、封装后的不变数据流,它用于外部订阅者接收数据变化。

通过这样的封装,ViewModel 内部可以自由地更新 Relay 数据,而外部的订阅者只能监听变化,无法直接修改数据流,这有助于提高代码的清晰度和可维护性。

相关文章

  • 一些 Combine 的实际场景

    摘自《SwiftUI和Combine编程》---《SwiftUI中的Combine》 对于通过 Action 改变...

  • 2021-01-27

    Combine之核心概念 Combine解决的核心问题是如何处理时间序列数据,也就是随着时间变化而变化的数据。它有...

  • SwiftUI(Combine)学习整理(三)

    如果有RxSwift的学习经验那么理解combine会更加迅速 通过对事件处理的操作进行组合 (combine) ...

  • Power Query对不同标题数据进行合并的技巧

    原数据: (一) 思路 需要进行表格的合并,通常来说需要把标题给统一,这样直接通过Table.Combine函数即...

  • pandas数据分组与聚合

    一、数据分组 1.groupby简介 groupby的运算核心为split-apply-combine,首先,数据...

  • Spring mvc之RequestCondition接口

    1. 定义 请求映射条件的合同。 请求条件可以通过combine(Object)组合,通过getMatchingC...

  • hadoop

    mapreduce 的编程模型 数据编程模型: input--split--map--(combine,parti...

  • Combine

    首先Combine是apple的一个framework通过联合 event-processing operator...

  • Combine Two Tables

    按照id合并两个表Combine Two Tables数据库左连接操作

  • leetcode 数据库相关

    数据库相关 Easy 175. Combine Two Tables https://leetcode.com/p...

网友评论

      本文标题:Combine 通过 PassthroughRelay 的数据发

      本文链接:https://www.haomeiwen.com/subject/ubaxyjtx.html