zoukankan      html  css  js  c++  java
  • 请求更多后台时间-陈棚

    假如应用程序正在知心文件下载或者文件传输等,当应用进入后台时,如果该任务还没有执行王成,应用转入后提啊后,该任务就会被暂停.千万不要强制在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:方法结束后台任务.

  • 相关阅读:
    可执行程序的装载
    stdafx.h的作用
    AI调色板
    3ds max输出图片
    3ds max移除几何体的线段
    3ds max删除了对象后,还是将原来所有对象输出的原因
    vs win32 & MFC 指针默认位置
    3ds max 分离对象
    PDF
    endnote设置文献第二行悬挂缩进办法
  • 原文地址:https://www.cnblogs.com/sixindev/p/4521494.html
Copyright © 2011-2022 走看看