Асинхронный обратный вызов для нескольких циклов в Swift 3

#swift #multithreading #asynchronous

#swift #многопоточность #асинхронный

Вопрос:

В одном из проектов, над которыми я работаю, я планирую несколько уведомлений для разных элементов в моей базе данных. Вот некоторый код :

 func setupNotifications() {
   for medecine in medecineList! {
        if !medecine.whichDaysArray.contains(Medecine.Days.EveryDay.rawValue) {           
            for day in medecine.whichDaysArrayDate {
                for fTime in medecine.frequencyTimeDateArray {
                    self.createNotificationsForUniqueDays(parsedMedecine: medecine, parsedDay: day, parsedFTime: fTime)
                }   
            }
        }
        else {
            for fTime in medecine.frequencyTimeDateArray {
                self.createNotificationsForEveryDay(parsedMedecine: medecine, parsedFTime: fTime)
            }
        }
    }
    self.callback()
}

func createNotificationsForEveryDay(parsedMedecine: Medecine, parsedFTime: Date) {
    DispatchQueue.main.async {
        // Create the notification
    }
}
  

Как вы можете видеть, я намеренно поместил функцию, которая обрабатывает создание уведомлений в асинхронном потоке. Проблема в том, что я хотел бы вызывать метод callback() , когда каждая асинхронная задача закончит выполнять свою работу. Я понятия не имею, как этого добиться.

Любая помощь приветствуется, спасибо!

Ответ №1:

Метод createNotificationsForEveryDay должен иметь блок в качестве параметра. В этом блоке я бы проверил, обработал ли я последний элемент в frequencyTimeDateArray , и если бы я это сделал, я бы вызвал self.callback() .

Комментарии:

1. К сожалению, я не могу этого сделать. Потому что, как вы можете видеть, у меня есть несколько циклов. Один элемент в frequencyTimeDateArray может использоваться много раз в зависимости от того, сколько элементов имеется в whichDatesArray. И я не могу использовать эту логику для этого последнего массива, потому что перед этим есть предложение else / if. В конце я хочу, чтобы моя функция обратного вызова могла извлекать все ожидающие уведомления.