请求更多后台时间-陈棚

假如应用程序正在知心文件下载或者文件传输等,当应用进入后台时,如果该任务还没有执行王成,应用转入后提啊后,该任务就会被暂停.千万不要强制在applicationDidenterBackGround:方法中直接完成改任务--因为这回导致应用进入后台花费太多时间,iOS系统可能直接从内存中删除改应用.正确的做法是,以applicationDidEnterBackground:方法为瓶盖,告诉系统进入后台后还有更多的任务需要完成,从而向系统申请更多的后台时间.在这种方式下,当我们的应用处于后台时,即使用户正在使用其他应用,只要系统还有足够的内存,我们的引用就可以保存在内存中,iOS系统会保留应用鱼腥一段时间.

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    //使用默认的通知中心监听应用转入转入后台的过程
    //应用转入后台时会向通知中心发送UIApplicationDidEnterBackgroundNotification
    //从而激发enterBack:方法
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(enterBack:) name:UIApplicationDidEnterBackgroundNotification object:[UIApplication sharedApplication]];
}
-(void)enterBack:(NSNotification* )notification
{
    UIApplication * app = [UIApplication sharedApplication];
    //定义一个UIBackgroundTaskIdentifier类型(本质就是NSUinteger)的变量
    //改变量将作为后台任务的标识符
    __block UIBackgroundTaskIdentifier backTaskId;
    backTaskId = [app beginBackgroundTaskWithExpirationHandler:^{
        NSLog(@"===在额外申请的10分钟内依然没有完成任务===");
        //结束后台任务
        [app endBackgroundTask:backTaskId];
    }];
    if (backTaskId == UIBackgroundTaskInvalid) {
        NSLog(@"===ios版本不支持后台运行,后台任务启动失败===");
        return;
    }
    //将代码块以异步方式提交给系统的全局并发队列
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"===额外申请的后台任务时间为:%f==",app.backgroundTimeRemaining);
        //其他内存清理的代码也可在此完成
        for (int i = 0; i < 100; i++) {
            NSLog(@"下载任务完成了%d%%",i );
            //暂停10秒模拟正在执行后台下载
            [NSThread sleepForTimeInterval:10];
            NSLog(@"===剩余的后台任务时间为:%f===",app.backgroundTimeRemaining);
        }
        
        //结束后台任务
        [app endBackgroundTask:backTaskId];
        
    });
}

上面程序中的第1行粗体代码调用了UIApp;ication的beginBackgroundTaskWithExpirationHandler方法请求更火的后台执行时间(默认请求10分钟),第2行粗体字代码调用了dispatch_async()方法以异步方式提交代码块,该带模块可以在后台运行较长时间,当代码块中的后台任务执行王成后,第3行粗体字代码调用了endBackgroundTask:方法结束后台任务.

原文地址:https://www.cnblogs.com/sixindev/p/4521494.html