如何在后台线程中按顺序运行任务[重复]

Posted

技术标签:

【中文标题】如何在后台线程中按顺序运行任务[重复]【英文标题】:How to run tasks in background thread sequentially [duplicate] 【发布时间】:2020-07-23 14:50:09 【问题描述】:

我有一个数据同步,它应该在后台线程中按顺序发生,因为一个任务需要在开始同步下一个任务之前完成。我尝试在调度队列中执行。但是当进程调度程序决定首先执行什么时,我遇到了很多问题。我的部分代码如下。

  DispatchQueue.main.async(execute: 
       SyncAgent.shared.initDataSync()
  ) 


 func initDataSync() 

  //These are not executing in the order. My objective is to make this happen sequentially in the background and notify the relevant screens once its completed. 
   syncUsers()
   syncDevices()
   syncAccouts()
   syncLocations()

 

【问题讨论】:

提供minimal-reproducible-example。 您需要处理完成以调用下一个。前任。 syncUser(completion: () -> Void) 请在您的问题中提供更多详细信息。如果syncUsers() 失败了怎么办?应该继续吗?它应该停止吗?有很多方法,但除非你弄清楚你的确切问题是什么,否则没有办法回答这个问题。你可以使用Combine, OperationQueue & Operation & 依赖,... 【参考方案1】:

要在后台线程(或者说,主线程以外的任何线程)中运行您的函数,您可以尝试创建自定义队列。

例如:

let myQueue = DispatchQueue(label: "serial") // DispatchQueue is serial by default
myQueue.asyc 
    // 1st function

myQueue.asyc 
    // 2nd function

串行 DispatchQueue 确保您添加到其中的函数按照您添加它们的顺序被调用。

但是如果你想让第二个函数等待第一个函数的结果,你可以例如给每个函数添加一个completionHandler,以便在完成时调用下一个函数:

func doSomething(completionHandler: () -> Void) 
    // do something
    // ...
    // call completionHandler when everything is finished
    completionHandler()

或者使用 DispatchGroup 来通知每个作业何时完成。这实际上取决于您的任务的复杂性。 (另外,Operation API 也是处理并发任务的灵活工具。)

【讨论】:

请记住,串行队列不能保证异步函数的执行顺序。只能保证同步函数的串行执行。 感谢您的说明。这就是我在后半部分要提到的,但可能我的英语不好没有解释清楚。

以上是关于如何在后台线程中按顺序运行任务[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Android中使用IntentService运行后台任务

如何显示屏幕并运行一些“后台”任务(不使用线程)

Android Service 和线程中运行的重复性任务

如何使用 Kotlin-Multiplatform 在 iOS 应用程序的后台线程中运行任务?

在后台线程执行硬任务,在主线程返回结果

如何在后台线程上创建 NSTimer?