无法启动 beginBackgroundTask swift 3
can't start beginBackgroundTask swift 3
抱歉,我卡住了,但我正在尝试启动后台任务(XCode8、swift 3)
在AppDelegate.swift中:
func applicationDidEnterBackground(_ application: UIApplication) {
var bgTask: UIBackgroundTaskIdentifier = 0;
bgTask = application.beginBackgroundTask(withName:"MyBackgroundTask", expirationHandler: {() -> Void in
print("The task has started")
application.endBackgroundTask(bgTask)
bgTask = UIBackgroundTaskInvalid
})
}
该应用从未显示 "The task has started" 消息。我做错了什么?
过期处理程序块在后台运行一段时间后(通常为 5 分钟左右)被调用。
如果您的后台任务需要很长时间才能完成,这意味着用于编写清理逻辑。
你的代码没有问题,你只需要在后台等待后台任务过期即可。
你对后台任务的使用都是错误的。
等待调用过期处理程序来调用 endBackgroundTask
是一种糟糕的做法,它会使您的应用浪费比它需要的更多的资源。当你的后台任务完成时,你应该立即告诉 iOS。
所以你应该这样做:
func applicationDidEnterBackground(_ application: UIApplication) {
var finished = false
var bgTask: UIBackgroundTaskIdentifier = 0;
bgTask = application.beginBackgroundTask(withName:"MyBackgroundTask", expirationHandler: {() -> Void in
// Time is up.
if bgTask != UIBackgroundTaskInvalid {
// Do something to stop our background task or the app will be killed
finished = true
}
})
// Perform your background task here
print("The task has started")
while !finished {
print("Not finished")
// when done, set finished to true
// If that doesn't happen in time, the expiration handler will do it for us
}
// Indicate that it is complete
application.endBackgroundTask(bgTask)
bgTask = UIBackgroundTaskInvalid
}
另请注意,您应该在任何 class 中的任何代码周围使用 beginBackgroundTask/endBackgroundTask
,即使应用程序进入后台,您也希望在短时间内保留 运行。
在此设置中,如果在 while
循环仍在工作时任务未完成,则 expirationHandler
会在 不同的线程上并行调用 .您应该使用处理程序来停止您的代码并允许它到达 application.endBackgroundTask(bgTask)
行。
抱歉,我卡住了,但我正在尝试启动后台任务(XCode8、swift 3)
在AppDelegate.swift中:
func applicationDidEnterBackground(_ application: UIApplication) {
var bgTask: UIBackgroundTaskIdentifier = 0;
bgTask = application.beginBackgroundTask(withName:"MyBackgroundTask", expirationHandler: {() -> Void in
print("The task has started")
application.endBackgroundTask(bgTask)
bgTask = UIBackgroundTaskInvalid
})
}
该应用从未显示 "The task has started" 消息。我做错了什么?
过期处理程序块在后台运行一段时间后(通常为 5 分钟左右)被调用。 如果您的后台任务需要很长时间才能完成,这意味着用于编写清理逻辑。
你的代码没有问题,你只需要在后台等待后台任务过期即可。
你对后台任务的使用都是错误的。
等待调用过期处理程序来调用 endBackgroundTask
是一种糟糕的做法,它会使您的应用浪费比它需要的更多的资源。当你的后台任务完成时,你应该立即告诉 iOS。
所以你应该这样做:
func applicationDidEnterBackground(_ application: UIApplication) {
var finished = false
var bgTask: UIBackgroundTaskIdentifier = 0;
bgTask = application.beginBackgroundTask(withName:"MyBackgroundTask", expirationHandler: {() -> Void in
// Time is up.
if bgTask != UIBackgroundTaskInvalid {
// Do something to stop our background task or the app will be killed
finished = true
}
})
// Perform your background task here
print("The task has started")
while !finished {
print("Not finished")
// when done, set finished to true
// If that doesn't happen in time, the expiration handler will do it for us
}
// Indicate that it is complete
application.endBackgroundTask(bgTask)
bgTask = UIBackgroundTaskInvalid
}
另请注意,您应该在任何 class 中的任何代码周围使用 beginBackgroundTask/endBackgroundTask
,即使应用程序进入后台,您也希望在短时间内保留 运行。
在此设置中,如果在 while
循环仍在工作时任务未完成,则 expirationHandler
会在 不同的线程上并行调用 .您应该使用处理程序来停止您的代码并允许它到达 application.endBackgroundTask(bgTask)
行。