Как последовательно запускать задачи в фоновом потоке

У меня есть синхронизация данных, которая должна происходить в фоновом потоке в последовательном порядке, так как одна задача должна быть завершена до начала синхронизации следующей. Я попытался выполнить в очереди отправки. Но затем, когда планировщик процессов решает, что выполнять первым, я столкнулся с множеством проблем. Мой частичный код, как показано ниже.

  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()

 }

person danu    schedule 23.07.2020    source источник
comment
Укажите минимально-воспроизводимый-пример.   -  person Frankenstein    schedule 23.07.2020
comment
Вам нужно обработать завершения, чтобы вызвать следующий. бывший. syncUser(completion: () -> Void)   -  person Ömer Faruk Öztürk    schedule 23.07.2020
comment
Пожалуйста, включите больше деталей в свой вопрос. Что делать, если syncUsers() не удается? Следует ли продолжать? Должен ли он остановиться? Есть много способов, но пока вы не уточните, в чем заключается ваша точная проблема, вы не сможете ответить на этот вопрос. Вы можете использовать зависимости Combine, OperationQueue и Operation &,...   -  person zrzka    schedule 23.07.2020


Ответы (1)


Чтобы запустить вашу функцию в фоновом потоке (или, скажем, в любом потоке, кроме основного потока), вы можете попробовать создать пользовательскую очередь.

Например:

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

Последовательная очередь DispatchQueue гарантирует, что функция, которую вы добавляете в нее, вызывается в том порядке, в котором вы их добавляете.

Но если вы хотите, чтобы вторая функция ждала результата первой функции, вы можете, например, добавить завершениеHandler к каждой функции, чтобы вызвать следующую функцию после завершения:

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

Или используйте DispatchGroup для уведомления о завершении каждого задания. На самом деле все зависит от сложности вашей задачи. (Кроме того, Operation API также является гибким инструментом для решения задач параллелизма.)

person paky    schedule 23.07.2020
comment
Имейте в виду, что последовательная очередь не гарантирует порядок выполнения асинхронных функций. Он может гарантировать последовательное выполнение только для синхронных функций. - person Dávid Pásztor; 23.07.2020
comment
Спасибо, что разъяснили. Это то, что я хочу упомянуть в последней части, но, возможно, мой плохой английский не объяснил это ясно. - person paky; 23.07.2020