Как получить данные из Alamofire в функции «executeFetchWithCompletionHandler» в делегате приложения? - PullRequest
0 голосов
/ 07 декабря 2018

Хорошо, поэтому я очень старался получить ответ на этот вопрос, но я до сих пор не могу заставить Alamofire творить чудеса, когда я имитирую фоновое обновление через XCode.

Вот как выглядит моя упомянутая функция в делегате приложения

func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { 

    let vc = ViewController()
    vc.fetchData()
    vc.sendNoti(currentFlightRules: currentFlightRules)
    completionHandler(.newData)
        print("Background Fetch Complete! UP")
}

fetchData () - это та, которая имеет запрос API через Alamofire и не запускается, тогда как sendNoti ()делает.Я знаю, что эта реализация работает, как при моделировании фонового обновления, выполняемого оператором печати. ​​

Я был бы очень признателен за помощь в этом, поскольку я не знаком с тем, как выполнять задачи в фоновом режиме, и особенносетевые задачи в фоновом режиме.Заранее спасибо.

1 Ответ

0 голосов
/ 08 декабря 2018

Ваша проблема в том, что fetchData завершится асинхронно.Это означает, что sendNotification и completionHandler будут вызваны до завершения сетевой операции.

Вам нужна функция fetchData, чтобы принимать и вызывать обработчик завершения, когда он имеет данные.Затем вы вызываете метод уведомления и фоновую выборку completionHandler из этого замыкания:

func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { 

    let vc = ViewController()
    vc.fetchData { (error, data) in 
        guard error == nil else {
            print("There was an error \(error!.localizedDescription)")
            completionHandler(.failed)
            return
        }

        if let newData = data {
            vc.sendNoti(currentFlightRules: newData)
            completionHandler(.newData)
        } else {
            completionHandler(.noData)
        }
    }
}

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

...