如何在 App Delegate 的“performFetchWithCompletionHandler”函数中从 Alamofire 获取数据?
Posted
技术标签:
【中文标题】如何在 App Delegate 的“performFetchWithCompletionHandler”函数中从 Alamofire 获取数据?【英文标题】:How to get data from Alamofire in the "performFetchWithCompletionHandler" function in the App Delegate? 【发布时间】:2018-12-07 20:06:24 【问题描述】:好的,所以我一直在努力寻找答案,但是当我通过 Xcode 模拟后台刷新时,我仍然无法让 Alamofire 发挥它的魔力。
这就是我在应用程序委托中所说的功能的样子
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() 是通过 Alamofire 发出 API 请求的那个,它不会运行,而 sendNoti() 会运行。我知道这个实现是在我模拟后台刷新打印语句执行时运行的。
我非常感谢您对此提供的帮助,因为我不熟悉如何在后台执行任务,尤其是在后台执行网络任务。提前致谢。
【问题讨论】:
【参考方案1】:您的问题是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)
我还建议您进行重构,以便您的获取和通知操作不包含在视图控制器中;他们应该被分成自己的班级。
【讨论】:
非常感谢。现在像魅力一样工作:)以上是关于如何在 App Delegate 的“performFetchWithCompletionHandler”函数中从 Alamofire 获取数据?的主要内容,如果未能解决你的问题,请参考以下文章
如何从app delegate访问NSViewController?
在 App Delegate 上调用服务器后如何更改根控制器?