前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Combine-Subject

Combine-Subject

作者头像
YungFan
发布2020-05-09 16:43:16
6970
发布2020-05-09 16:43:16
举报
文章被收录于专栏:学海无涯学海无涯

Subject是一种特殊的 Publisher,最大的特点是可以手动发送数据。定义如下:

代码语言:javascript
复制
public protocol Subject : AnyObject, Publisher {
    func send(_ value: Self.Output)
    func send(completion: Subscribers.Completion<Self.Failure>)
    func send(subscription: Subscription)
}

从定义可以看到,Subject 暴露了 3 个 send 方法,调用者可以通过send方法来手动发布Output数据以及Completion事件。

内置Subject

PassthroughSubject

简单地将通过 send 发送数据或事件给下游的 Publisher 或 Subscriber, 并不会对接收到的数据进行保留

代码语言:javascript
复制
import Combine

// 1 创建PassthroughSubject
let subject = PassthroughSubject<String, Never>()
// 2 订阅
let subscription = subject.sink(receiveCompletion: { _ in
    print("receiveCompletion")
}, receiveValue: { value in
    print(value)
})
// 3 发送数据
subject.send("Hello")
subject.send("Combine")
subject.send(completion: .finished)

/* 输出
 Hello
 Combine
 receiveCompletion
 */

CurrentValueSubject

保留一个最后的数据,并在被订阅时将这个数据发送给下游的 Publisher 或 Subscriber。

代码语言:javascript
复制
import Combine

// 1 创建CurrentValueSubject,需要初始化一个数据
let subject = CurrentValueSubject<String, Never>("Hello")
// CurrentValueSubject有value属性
print(subject.value)

// 2 发送数据
subject.send("Combine")
print(subject.value)

// 3 订阅
let subscription = subject.sink { value in
    print(value)
}

/* 输出
 Hello
 Combine
 Combine
 */
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 内置Subject
    • PassthroughSubject
      • CurrentValueSubject
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档