Swift Combine — Scheduler(subscribe(on:)和receive(on:)的使用)

SwiftCombine 框架中,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.mainOperationQueue.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
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值