Ждете, пока уведомления будут добавлены, прежде чем продолжить с остальным моим кодом? - PullRequest
0 голосов
/ 16 сентября 2018

Мое приложение планирует 64 уведомления в тот момент, когда пользователь нажимает кнопку «Сохранить».Если при добавлении уведомления произошла ошибка, я бы хотел отобразить сообщение об ошибке.Однако добавление уведомлений происходит асинхронно, поэтому я не могу вовремя обнаружить ошибку.Как я могу заставить мою ветку ждать, пока все уведомления будут добавлены, прежде чем продолжить?Моя переменная errorSettingUpNotifications всегда равна false из-за асинхронных функций, поэтому моя проверка ошибок внизу в настоящее время не работает.

    var errorSettingUpNotifications = false
    for i in 0...maxNumberOfReminders
    {
        let randomWordIndex = Int(arc4random_uniform(UInt32(Int(words.count - 1))))
        let content = UNMutableNotificationContent()
        let identifier = "Word\(i)"
        content.title = "Word Of The Day"
        content.body = "\(Array(words)[randomWordIndex].key) - \(Array(words)[randomWordIndex].value)"
        let trigger = UNCalendarNotificationTrigger(dateMatching: Calendar.current.dateComponents([.year, .month, .day, .hour, .minute], from: Calendar.current.date(byAdding: .day, value: i, to: startDate)!), repeats: false)
        let request = UNNotificationRequest(identifier: identifier, content: content, trigger: trigger)
        UNUserNotificationCenter.current().add(request){
            (error) in
            if error != nil
            {
                errorSettingUpNotifications = true
            }
        }
    }
    if (errorSettingUpNotifications == true)
    {
        SVProgressHUD.showError(withStatus: "There was an error setting up your notifications. Please check your internet connection and try again.")
    }
    else
    {
        SVProgressHUD.showSuccess(withStatus: "Settings saved successfully")
    }

1 Ответ

0 голосов
/ 16 сентября 2018

Вы можете использовать DispatchGroup для достижения этой цели.Начиная с Документация Apple .

DispatchGroup позволяет выполнять совокупную синхронизацию работы.Вы можете использовать их для отправки нескольких разных рабочих элементов и отслеживания их завершения, даже если они могут выполняться в разных очередях.

Вот как это работает.

// Create a dispatch group
let group = DispatchGroup()

var errorSettingUpNotifications = false

for i in 0...maxNumberOfReminders {
    // New block started
    group.enter()

    // Setup notification

    UNUserNotificationCenter.current().add(request) { (error) in
        if error != nil {
            errorSettingUpNotifications = true
        }
        // Block completed
        group.leave()
    }
}

group.notify(queue: .main) {
    if errorSettingUpNotifications {
        // Show error message if failed
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...