Background Task

461 阅读1分钟
__block UIBackgroundTaskIdentifier task = [[UIApplication sharedApplication] beginBackgroundTaskWithName:@"logTime" expirationHandler:^{
**__block** **int** i = 0;

          /** 获取一个全局的线程来运行计时器*/

          dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

          /** 创建一个计时器*/

         **__block** dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);

      

          /** 设置计时器, 这里是每10毫秒执行一次*/

          dispatch_source_set_timer(timer, dispatch_walltime(**nil**, 0), 1000 * NSEC_PER_MSEC, 0);

          /** 设置计时器的里操作事件*/

          dispatch_source_set_event_handler(timer, ^{

              //do you want....

              **if** (i == 10000) {

                  dispatch_cancel(timer);

                  timer = **nil**;

                  [[UIApplication sharedApplication] endBackgroundTask:task];

                 task = UIBackgroundTaskInvalid;

              }

              NSLog(@"current date = %@",[NSDate date]);

              i++;

          });

          dispatch_resume(timer);
         [[UIApplication sharedApplication] endBackgroundTask:task];

         task = UIBackgroundTaskInvalid;

      }];

当应用进入后台后不会马上执行后台任务,等待了3分钟左右才开始执行block中的任务。当应用没有因内存问题被系统kill的时候,这个任务应该是可以一直执行下去的,我的测试时间超过了30分钟。且测试中发现iphone会优先回收没有后台任务的应用,虽然当前任务的执行在不断开启新应用的情况下出现的卡卡顿顿,但最后依旧会继续执行,当前应用并没有因为不断开启新应用而被kill。