app进入后台,会停止所有线程;需要在applicationDidEnterBackground中调用beginBackgroundTaskWithExpirationHandler申请更多的app执行时间,以便结束某些任务,如
AVAssetWriter的(ios中当AVAssetWriter处于AVAssetWriterStatusWriting状态时,若进入了后台状态将导致后续操作失败,详情查看startWriting的注释说明)
使用记录:
1,
可以在 AppDelegate中的applicationDidEnterBackground 中申请
由于在 AppDelegate 很多时候不方便调用结束指定工作的方法 也可以通过
[[NSNotificationCenterdefaultCenter]addObserver:self selector:@selector(applicationDidEnterBackground:)name:UIApplicationDidEnterBackgroundNotificationobject:nil];
在合适的地方添加委托2,
根据网上资料添加了委托
- (void)applicationDidEnterBackground:(UIApplication *)application {
_backtaskIdentifier = [application beginBackgroundTaskWithExpirationHandler:^(void){
if (_backtaskIdentifier!=UIBackgroundTaskInvalid) {
[[UIApplication sharedApplication] endBackgroundTask:_backtaskIdentifier];
_backtaskIdentifier = UIBackgroundTaskInvalid;
}
}];
}
结果调用beginBackgroundTaskWithExpirationHandler报错:
NSInvalidArgumentException', reason: '-[NSConcreteNotification beginBackgroundTaskWithExpirationHandler:]: unrecognized selector sent to instance
其中[NSConcreteNotification beginBackgroundTaskWithExpirationHandler:] 明显有问题,
原因是此处的参数application并非 uiapplication类型,需要将代码改为
_backtaskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^(void){
if (_backtaskIdentifier!=UIBackgroundTaskInvalid) {
[[UIApplication sharedApplication] endBackgroundTask:_backtaskIdentifier];
_backtaskIdentifier = UIBackgroundTaskInvalid;
}
}];
3, 一开始没想明白 beginBackgroundTaskWithExpirationHandler 的用法,经过测试才明白,只要调用了此函数系统就会允许app的所有线程继续执行,直到任务结束(1, [[ UIApplication sharedApplication ] backgroundTimeRemaining ] 的时间结束 2,调用endBackgroundTask )