请求更多后台时间-陈棚

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

时间: 2024-08-02 11:50:57

请求更多后台时间-陈棚的相关文章

IOS 后台运行申请更多的时间

当应用程序进入后台时,系统会自动回调应用程序委托的applicationDidEnterBackground:方法. 应用可以在该方法中完成转入后台前需要做的准备工作,所有的应用需要做以下事情. 释放所有可以释放的内存. 保存用户数据或状态信息,所有没写入磁盘的文件或信息,在进入后台之前,都应该写入磁盘,因为程序可能在后台被杀死. 进入后台时释放内存 当程序进入后台之后,为了确保获得最佳的用户体验,建议释放那些占用内存较大且可以重新获取的资源—- 这是因为当应用处于后台时,iOS系统会优先终止那

iOS申请持续的后台时间

iOS申请持续的后台时间 分类:IOS开发相关 (877)  (0) 由于苹果的后台机制,当我们按下home键的时候,所有线程包括主线程的任务都会被挂起,一些资源比如socket也会被系统回收,会导致很多问题,比如一个很重要的资源中断下载,或者定时器方法被暂停等等. 苹果在4.0以后提供了一种申请后台时间的机制: - (UIBackgroundTaskIdentifier)beginBackgroundTaskWithExpirationHandler:(void (^)(void))handl

获取系统完成任务所需要的后台时间

有没有一种情况,当软件退出后,你还是需要运行一点东西,或者是需要很长时间来运行的一个代码.此时,就需要向后台申请时间了.但是官司方资料. 根据苹果文档中关于后台执行的描述,任何app都有10分钟左右的后台任务执行时间. 10分钟后,app会被iOS强行挂起. 但是,有5类app允许有“无限的”后台运行时间: 1.  Audio. 2.  Location/GPS. 3.  VoIP. 4.  Newsstand. 5.  Exernal Accessory . 你可以将任何app声明为上述5种类

利用ES6的Promise.all实现至少请求多长时间

1.背景 我们都知道ajax请求可以加个timeout,就是最多请求多少时间,如果超过这个时间直接就报错. 这个是最多请求多长时间,我现在要做的是,最少要请求多长时间,然后才能执行后续的逻辑. 比如,一个ajax请求 x 毫秒就执行完毕了,但我要让他至少执行1秒钟,那我们会这么想: ajax完成后 , 1. 如果x<1s, 那我们先setTimeout => 1s - x ,然后执行后续操作. 2 如果x>=1s, 那我们直接执行后续操作. 想想这可繁琐了,我们还要在前面记录一下开始时间

使用CURL检测Clinet侧发起的HTTP请求各阶段时间

前言 上周,我方的一个客户反馈,访问我们的接口,平均耗时在2s以上.但是我方对请求进入,和请求返回,整个过程都有监控,我方的耗时基本在50ms以内,非常快. 后来了解到,客户从广东访问到我方上海,公网来访问我方.那么就建议去检测,DNS耗时,TCP建立的耗时等.理论上,长距离的公网,网络延迟就非常高.遂建议使用CURL去检查.结果果然如猜想,在TCP建立的耗时就很久. 进入正题,这篇文章主要介绍使用CURL检测Client端发起的HTTP请求,各个阶段的时间. 第一.HTTP请求的过程介绍 一个

[Swift 工作tips] 之 使用Alamofire做网络请求时设置请求超时(timeout)时间

在应用开发过程中,经常需要网络请求,在网络请求的过程中,一般的第三方网络框架的超时时间比较长为15秒: 那么,我们如何来指定请求的超时时间呢? 在Swift的世界里,比较有名的网络是Alamofire   GitHut地址:https://github.com/Alamofire/Alamofire 那么,在使用Alamofire 的时候,设置Alamofire的请求时间如下: 本例代码如下: 1 var alamofireManager : Manager? 2 // 设置请求的超时时间 3

angular的post请求,SpringMVC后台接收不到参数值的解决方案

这是我后台SpringMVC控制器接收isform参数的方法,只是简单的打出它的值: @RequestMapping(method = RequestMethod.POST) @ResponseBody public Map<String, Object> save( @RequestParam(value = "isform", required = false) String isform) { System.out.println("isform value

前台ajax请求php后台返回成功却进error方法解决

最近几天一直都在解决error问题,周末都没能好好过,悲痛万分,想逃走??..... 一.悲痛的开端 项目用jQuery的ajax方法请求php后台,前台代码写的没有问题,后台返回的json数据大概也是对的(猜的,后来验证了json是对的),然后悲剧就如约而至: 先看核心代码: $.ajax({ type:"POST", url:"{:U('City/adds')}", data:{}, dataType: 'json', success:function(data

请求更多的后台时间

1 - (void)applicationDidEnterBackgtound 2 { 3 UIApplication *app = [UIApplication sharedApplication]; 4 __block UIBackgroundTaskIdentifier taskId; 5 6 taskId = [app beginBackgroundTaskWithExpirationHandler:^{ 7 NSLog(@"%@",NSStringFromSelector(_