阅读须知:本文重点关注这三者的基本用处和区别,对于三者的详细说明在此不做介绍,有需要的读者推荐阅读:链接: Swift Combine 入门导读

1. Publisher 用法

在最简单的情况下我们使用 Publishersink实现一个简单数据流

import Combine

let publisher = ["Here","we","go!"].publisher

let subscription = publisher.sink { value in
    print("subs received value: (value)")
}

// 运行结果
//subs received value: Here
//subs received value: we
//subs received value: go!

在上面的案例中,publisher 初始化存储了一些数据,并且在被订阅后将这些数据逐个发出。这些数据发送完毕后,订阅者会收到一个完成的通知,并且这条管道会被关闭。当然,我们可以在下面再次使用 publisher.sink 订阅这些数据,这些数据会被再次逐个发送给新的订阅者。

2. PassthroughSubject 用法

想必大家看完上面的Publisher案例后都会产生疑问,因为我们开发中大部分时间都是需要根据需要随时发布消息,而不是发布一条已经确定的数据流我们如何实现随时插入数据呢,接下来我们就会用到 Subject。Subject 通常是一个中间代理,但是他不仅可以作为代理,还可以独立作为一个 Publisher 来发布消息

独立作为Publisher示例代码,请仔细阅读注释理解
import Combine

// 初试化了一个 Subject定义发布数据类型为 String 而且 Never 报错,更详细的用法请阅读文章开头推荐链接
let pubSubject = PassthroughSubject<String, Never>()

// 在订阅之前 Send消息丢失
pubSubject.send("订阅之前发送丢失的数据")

let subscription = pubSubject.sink { value in
		print("subscription1 received value: (value)")
}

pubSubject.send("Hello")
pubSubject.send("World!")

// 发送 (completion: .finished) 代表全部发完了,通知订阅结束
pubSubject.send(completion: .finished)
pubSubject.send("订阅已经收到结束的通知,这条没用了!")

// 运行结果
//subscription1 received value: Hello
//subscription1 received value: World

在上面的例子里我们使用 PassthroughSubject 初试化了一个发布者,可以使用Send发布消息,但是需要注意的是,在被订阅之前,Send的数据都是无效的,都会丢失

作为中间代理,使用 Publisher.subscribe(_Subject)
import Combine

let observeSubject = PassthroughSubject<String, Never>()

let subscription = observeSubject.sink { value in
        print("observeSubject received value: (value)")
}

observeSubject.send("主动发布消息")

// 使用publisher.subscribe(Subject),可以将publisher的数据逐个发送到Subject里进行处理
let publisher = ["Publisher发布消息","发布","消息"].publisher
publisher.subscribe(observeSubject)

// 因为在1中publisher的用法中我们说过,这些publisher数据发送完毕后,会发送一个完成的通知
// 就相当于上面的 publisher 还发了一个 .send(completion: .finished) ,因此这个订阅已经结束,后面主动发消息没用
observeSubject.send("这里发的消息收不到了,为什么呢,看上面注释")

在上面的例子里我们介绍了 publisher.subscribe(_Subject) , 其实开发中也很少用到,为了保持统一性和阅读性我们还是习惯用Subject.send来发送各种消息,和信号

3. CurrentValueSubject

CurrentValueSubject 和 PassthroughSubject 完全类似,区别在于 CurrentValueSubject 会始终记录下之前发送的值,并在订阅后将当前记录值发出去。

import Combine

let subject = CurrentValueSubject<String, Never>("初始化值,如果没被覆盖,订阅时会先收到我")

// 此时在订阅之前发的(最新的一个)消息就不会漏掉了。
subject.send("我就随便发一下,覆盖掉上次发送的值,被记录下来")

// 订阅时会先把当前记录的值发出去。
let subscription = subject.sink { value in
        print("observeSubject received value: (value)")
}

subject.send("Hello World")

let publisher = ["Here","we","go!"].publisher
publisher.subscribe(subject)

// 运行结果
// subject received value: 我就随便发一下,会被记录下来,而且覆盖掉上次发送的值
// subject received value: Hello World
// subject received value: Here
// subject received value: we
// subject received value: go!

本文参考链接

Swift Combine 入门导读: https://www.jianshu.com/p/a4f1a263eabb

强烈推荐

用 Xcode Playground 学习 Combine:https://github.com/AvdLee/CombineSwiftPlayground

原文地址:https://blog.csdn.net/qq_40805985/article/details/129440180

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_26278.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注