swift - 如何在后台线程中按顺序运行任务
问题描述
我有一个数据同步,它应该在后台线程中按顺序发生,因为一个任务需要在开始同步下一个任务之前完成。我尝试在调度队列中执行。但是当进程调度器决定首先执行什么时,我遇到了很多问题。我的部分代码如下。
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()
}
解决方案
要在后台线程(或者说,主线程以外的任何线程)中运行您的函数,您可以尝试创建自定义队列。
例如:
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 也是处理并发任务的灵活工具。)
推荐阅读
- c# - 将日志目标写入 EventStore
- php - 如何在 nginx-bitnami-CI 中设置子目录?
- javascript - 如何使用 sequelize 或 sql 从不同的表聚合总和?
- python - 在 H2O 框架中查找小时
- devops - 从 Rundeck 触发 control-m 中的作业
- c# - Handlebars.Net 如果比较助手未检测到参数类型
- java - liquibase 中的动态占位符配置生成动态校验和
- arrays - 如何按时间戳对值进行分组
- javascript - 无法在 vue cli 3 中运行命令 ~$ vue add unit-mocha
- javascript - 路线变更的工兵事件