在继续上传操作时,如何延长 iOS 应用的后台执行时间?



我希望用户在离开应用程序时继续在前台启动的上传操作。苹果公司的文章延长你的应用程序的后台执行时间有以下代码列出

func sendDataToServer( data : NSData ) {
// Perform the task on a background queue.
DispatchQueue.global().async {
// Request the task assertion and save the ID.
self.backgroundTaskID = UIApplication.shared.
beginBackgroundTask (withName: "Finish Network Tasks") {
// End the task if time expires.
UIApplication.shared.endBackgroundTask(self.backgroundTaskID!)
self.backgroundTaskID = UIBackgroundTaskInvalid
}

// Send the data synchronously.
self.sendAppDataToServer( data: data)

// End the task assertion.
UIApplication.shared.endBackgroundTask(self.backgroundTaskID!)
self.backgroundTaskID = UIBackgroundTaskInvalid
}
}

self.sendAppDataToServer( data: data)的调用不清楚。这是上传操作的目的地吗,封装在Dispatch.global().sync { }中?

您在Apple文档中偶然发现了一个不太出色的代码示例。

  • 首先,如果您执行同步网络请求,您肯定应该将其调度到后台队列。如果你不这样做,你就有可能让监管程序杀死你的应用程序。但是,您不应该将网络请求同步地发送到全局队列,而是异步地发送,否则您只会遇到同样的问题,即阻塞主线程。

  • 话虽如此,但确实不应该同步执行网络请求。您应该异步执行它们,并在完成处理程序中结束后台任务。

  • 在这个例子中,他们使用NSData,我们不再使用它。

  • UIBackgroundTaskInvalid也不存在了。现在是UIBackgroundTaskIdentifier.invalid

  • 在苹果的辩护中,这个代码示例的重点是后台任务,而不是网络代码。他们真的不想陷入这个网络代码实现的杂草中,而是试图保持它的简单。话虽如此,它确实是一个可怕且过时的代码示例。

有关如何使用后台任务的更好示例,请参阅此答案。此外,如果上传可能需要30秒以上,我们根本不会使用后台任务,而是使用适当的(但更复杂的(后台URLSession。(请参阅后台下载文件。上传任务遵循此处概述的相同基本模式,但请确保从文件上传,而不是从Data上传。(

最新更新