在 Swift
的 Combine
框架中,Scheduler
是一个重要的概念,用于控制任务的调度和执行。本文将详细介绍 Scheduler
的作用、常见的 Scheduler
类型以及如何使用 Scheduler
来管理任务的执行。
Scheduler 的定义
Scheduler
用于管理任务的调度和执行,可以控制任务何时执行、在哪个线程或队列上执行以及执行的顺序。
你可以使用调度器来尽可能快地执行代码,或者在将来的某个时间执行。不同的调度器实现会根据自己的需要使用不同的时间保持系统。调度器将此表示为 SchedulerTimeType。由于该类型符合 SchedulerTimeIntervalConvertible,因此您可以始终使用 .milliseconds(500) 等方便函数来表示这些时间。调度器可以接受选项来控制它们执行传递给它们的操作的方式。这些选项可能控制哪些线程或分发队列执行操作等因素。
常见的 Scheduler 类型
常见的 Scheduler
类型包括一下几种:
DispatchQueue
: GCD(Grand Central Dispatch)中的调度器,用于在特定的调度队列上执行任务:串行、并发、主线程和全局队列。通常情况下,将后台任务分配到串行和全局队列上,而将与用户界面相关的任务分配到主线程队列上。RunLoop
:用于处理事件循环的机制,可以在特定的RunLoop
上执行任务,如主线程的RunLoop
。OperationQueue
:在特定的操作队列中执行任务。与DispatchQueue
类似,使用OperationQueue.main
进行UI操作,并使用其他队列进行后台操作。ImmediateScheduler
: 是一个立即执行任务的调度器,通常用于测试和调试目的。
使用RunLoop.main
, DispatchQueue.main
和 OperationQueue.main
都是和UI操作相关的,三者之间基本没什么区别。
默认Scheduler 类型
如果没有指定Scheduler
,那么系统会默认给添加一个,而这个Scheduler
的类型和Publisher
发送数据时的类型一致,比如主线程发送的数据,那么接收也在主线程。
class SchedulerViewModel: ObservableObject {
let publisher = PassthroughSubject<String, Never>()
private var cancellable = Set<AnyCancellable>()
init() {
setUpSubscription()
}
func setUpSubscription() {
publisher
.sink {
value in
print("\(value) is on main thread: \(Thread.isMainThread)")
}
.store(in: &cancellable)
}
func sendMessage() {
// on main thread
publisher.send("Text 1")
// on other thread
DispatchQueue.global().async {
[weak self] in