对iOS中的多任务API非常困惑,例如beginBackgroundTaskWithExpirationHandler等。
例如录制视频,按按钮开始录制时,我们放
if ([[UIDevice currentDevice] isMultitaskingSupported]) {
[self setBackgroundRecordingID:[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{}]];
}
记录结束时
if ([[UIDevice currentDevice] isMultitaskingSupported]) {
[[UIApplication sharedApplication] endBackgroundTask:[self backgroundRecordingID]];
}
所以谁能解释这些意义何在。 正如您所看到的,当开始录制时,块beginBackgroundTaskWithExpirationHandler是空白的(无所事事?),这些代码的用法是什么?
非常感谢您的解释。
答案 0 :(得分:4)
这些电话的目的是让您的应用进入后台而不会像往常一样被暂停。他们要求系统为您的应用程序授予一些额外的生存时间,即使它已被落后。
你想在后台做的事情是 beginBackgroundTask...
和endBackgroundTask:
之间的谎言。重要的是,通过beginBackgroundTask...
宣布开始执行漫长的任务后,您必须随后致电endBackgroundTask:
让系统知道您已完成,现在可以暂停您。无论代码采用何种路径,您都必须始终平衡这些调用。一定要涵盖所有情况!
到期处理程序不你要在后台做的事情;正如FX正确地说的那样,它是一个错误处理程序。如果您超出了您的背景时间限制(标称为十分钟),它将在紧急情况下被召唤。如果它被调用,这意味着系统将立即暂停 ,你无法阻止它。
你永远不应该有一个空的过期处理程序!原因是如果你达到你的时间限制并且实际调用你的过期处理程序,如果它没有调用endBackgroundTask:
,那么系统就是不仅会强行暂停您的应用,它还会杀死您的应用!因此,您的到期处理程序必须始终执行得非常快,并且必须至少包含对endBackgroundTask:
的调用。
答案 1 :(得分:2)
将到期处理程序视为任何错误处理程序。系统仅允许后台应用程序使用有限的CPU时间,因此如果达到此限制,将终止后台操作,并调用您的处理程序。用它来清理应用程序的内部状态。