如何在 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 将异步完成。这意味着sendNotificationcompletionHandler 将在网络操作完成之前被调用。

您需要您的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 上调用服务器后如何更改根控制器?

如何从 UI 测试访问 App Delegate?

如何从二进制访问 App Delegate? [关闭]

如何从其他类(NSViewController 的子类)获取主窗口(App Delegate)?

iOS 如何告诉 App Delegate 从当前视图呈现新视图