ios 开启后台任务,beginBackgroundTaskWithExpirationHandler 使用细节问题备忘

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 )


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值