本文价值与收获
看完本文后,您将能够作出下面的界面
看完本文您将掌握的技能
- 掌握Combine的Publishers
- 掌握Combine的Subject
- 掌握Combine的PassthroughSubject
- 掌握Combine的CurrentValueSubject
- PassthroughSubject 与CurrentValueSubject的区别
- 用Passthrought整合SwiftUI实现乒乓球效果
Combine基础知识
Combine核心元素
Combines是由以下几个方面内容组成:
- Publisher 发布者
- subscripbes 订阅者
- operate 处理函数
Publisher 入门小demo
我们常用的Array,String和Dictionary都可以转化为Publisher.
let helloPublisher = "Hello Combine".publisher
let fibonacciPublisher = [0,1,1,2,3,5].publisher
let dictPublisher = [1:"Hello",2:"World"].publisher
您的subscribe订阅者可以通过sink响应publisher发布的消息
let fibonacciPublisher = [0,1,1,2,3,5].publisher
_ = fibonacciPublisher.sink { value in
print(value)
}
输出结果
0 1 1 2 3 5
捕获完成与失败
您的subscribe订阅者可以通过sink函数响应调用,block区域将会收到publisher发出的values
publisher可以发射零个活多个values,除了基本值之外,您的publisher还会发给订阅者特殊值。
- 如果订阅完成,将发出.finished
- 如果出现问题,将发出.failure(_)
失败返回值可以是自定义对象,一个Error对象或者Nevver对象。
let fibonacciPublisher = [0,1,1,2,3,5].publisher
_ = fibonacciPublisher.sink(receiveCompletion: { completion in
switch completion {
case .finished:
print("finished")
case .failure(let never):
print(never)
}
}, receiveValue: { value in
print(value)
})
输出
0 1 1 2 3 5
finished
如何取消订阅
如果要取消订阅,可以通过调用取消订阅来执行此操作。
let subscriber = fibonacciPublisher.sink { value in
print(value)
}
subscriber.cancel()
Subject发布者的特殊形式
Subject是publisher发布者的特殊形式,您可以订阅并动态地向其添加元素。目前有2种不同的类型
- PassthroughSubject:如果您订阅它,您将获得订阅后将发生的所有事件。
- CurrentValueSubject:将为任何订阅者提供最新的元素以及订阅发生后该序列发出的所有内容。
PassthroughSubject 订阅就响应
我们需要做的第一件事是创建一个实际的传递主题实例。这是超级容易,我们可以使用默认初始化器。
let passthroughObject = PassthroughSubject<String,Error>()
下面是send常用函数
- send(input:String)函数向该subject添加新值。
- send(completion:.finished)发送完成
- send(completion: someError)发送error
下面是例子
passthroughObject.send("Hello")
passthroughObject.send("World")
如果您在使用 send()添加"Hello"和"word",则subscribe订阅者不会收到这两个值。您只会收到订阅主题后发送的值