Combine 系列
- Swift Combine 从入门到精通一
- Swift Combine 发布者订阅者操作者 从入门到精通二
- Swift Combine 管道 从入门到精通三
- Swift Combine 发布者publisher的生命周期 从入门到精通四
- Swift Combine 操作符operations和Subjects发布者的生命周期 从入门到精通五
- Swift Combine 订阅者Subscriber的生命周期 从入门到精通六
- Swift 使用 Combine 进行开发 从入门到精通七
- Swift 使用 Combine 管道和线程进行开发 从入门到精通八
本章包括一系列模式和发布者、订阅者和管道的示例。 这些示例旨在说明如何使用 Combine 框架完成各种任务。
1. 使用 sink 创建一个订阅者
- 目的: 要接收来自发布者或管道生成的输出以及错误或者完成消息,你可以使用 sink 创建一个订阅者。
Sink 创建了一个通用订阅者来捕获或响应来自 Combine 管道的数据,同时支持取消和 发布者和订阅者的生命周期。
1.1 简单版本的 sink 是非常简洁的,跟了一个尾随闭包来接收从管道发送来的数据。
let cancellablePipeline = publishingSource.sink { someValue in
// do what you want with the resulting value passed down
// be aware that depending on the publisher, this closure
// may be invoked multiple times.
print(".sink() received \(someValue)")
})
1.2 带有完成事件和数据的 sink
let cancellablePipeline = publishingSource.sink(receiveCompletion: { completion in
switch completion {
case .finished:
// no associated data, but you can react to knowing the
// request has been completed
break
case .failure(let anError):
// do what you want with the error details, presenting,
// logging, or hiding as appropriate
print("received the error: ", anError)
break
}
}, receiveValue: { someValue in
// do what you want with the resulting value passed down
// be aware that depending on the publisher, this closure
// may be invoked multiple times.
print(".sink() received \(someValue)")
})
cancellablePipeline.cancel()
- Sinks 是通过发布者或管道中的代码链创建的,并为管道提供终点。 当 sink 在发布者创建或调用时,它通过
subscribe
方法隐式地开始了 发布者和订阅者的生命周期,并请求无限制的数据。 - Sinks 是可取消的订阅者。在任何时候,你可以使用 sink 末端对其的引用,并在上面调用
.cancel()
来使管道失效并关闭管道。
2. 使用 assign 创建一个订阅者
- 目的: 使用管道的结果来设置值,这个值通常是位于用户界面或控制组件上的属性,不过任何符合 KVO 的对象都可以提供该值。
Assign 是专门设计用于将来自发布者或管道的数据应用到属性的订阅者,每当它收到数据时都会更新该属性。 与 sink 一样,它创建时激活并请求无限数据。 Assign 要求将失败类型指定为 <Never>
,因此,如果你的管道可能失败(例如使用 try在这里插入代码片
Map 等操作符),则需要在使用 .assign
之前 错误处理。
2.1 简单的 assign 例子
let cancellablePipeline = publishingSource
.receive(on: RunLoop.main)
.assign(to: \.isEnabled, on: yourButton)
cancellablePipeline.cancel()
.assign
通常在创建时链接到发布者,并且返回值是可取消的。- 如果
.assign
被用于更新用户界面的元素,则需要确保在主线程更新它。这个调用确保了订阅者是在主线程上接收数据的。 - Assign 持有对使用 key path 更新的属性的引用,以及对正在更新的对象的引用。
- 在任何时候,你都可以调用
cancel()
终止和使管道失效。通常,当把从管道中更新的对象(如 viewController)销毁时,我们会取消管道。
参考
https://heckj.github.io/swiftui-notes/index_zh-CN.html
代码
https://github.com/heckj/swiftui-notes