我正在使用Alamofire来调用Web服务,这需要很长时间才能加载。如果应用程序进入后台,当我返回应用程序时,我会遇到我的加载程序。我想这是因为调用永远不会向我的完成处理程序返回任何内容。我该如何解决这个问题?
答案 0 :(得分:6)
您可以使用后台提取来解决此问题。它可以在Swift 3中以下列方式完成:
var backgroundTask: UIBackgroundTaskIdentifier? // global variable
backgroundTask = UIApplication.shared.beginBackgroundTask(withName: "backgroundTask") {
// Cleanup code should be written here so that you won't see the loader
UIApplication.shared.endBackgroundTask(self.backgroundTask!)
self.backgroundTask = UIBackgroundTaskInvalid
}
在此行之后调用您的alamofire服务。在完成处理程序中,使用以下行结束任务。
UIApplication.shared.endBackgroundTask(self.backgroundTask!)
self.backgroundTask = UIBackgroundTaskInvalid
请注意,该应用在进入无效状态之前还有一些后台时间(backgroundTimeRemaining
属性)。你必须在那之前完成任务。在剩余的后台时间达到零之前不久调用处理程序。此外,对方法beginBackgroundTask(withName:){}
的每次调用都必须通过匹配endBackgroundTask:
方法调用来平衡。
要使上面给出的代码有效,您需要调整应用中的设置。转到"目标"并点击"功能"进行以下更改
之后,转到info.plist文件,然后将其打开为Source以添加以下代码。
我希望这会对你有所帮助。如果您需要更详细的信息,这些链接可能会有所帮助
答案 1 :(得分:0)
该问题可以通过添加以下内容来解决:
application.beginBackgroundTask { }
进入func applicationDidEnterBackground(_ application: UIApplication)
和
application.endBackgroundTask(.invalid)
进入func applicationWillEnterForeground(_ application: UIApplication)