__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。