iOS GCD创建标准定时器,进入后台后任可继续定时

原创 2015年11月18日 14:22:39

要开启标准定时器,多线程是必须的。

次方法进入后台后定时器任会继续进行,无需开启后台任务。主要用于与定时器相关的功能,比如获取验证码,定时刷新的需要标准的定时器。


首先,那个时候用的时候是没有开启后台任务的,照样可以继续定时,可能iOS系统及相关API更新,先无法继续定时。还得在退出前台(或者进入后台)的回调开启后台任务

UIApplication*   app = [UIApplication sharedApplication];
    __block    UIBackgroundTaskIdentifier bgTask;
    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        dispatch_async(dispatch_get_main_queue(), ^{
            if (bgTask != UIBackgroundTaskInvalid)
            {
                bgTask = UIBackgroundTaskInvalid;
            }
        });
    }];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        dispatch_async(dispatch_get_main_queue(), ^{
            if (bgTask != UIBackgroundTaskInvalid)
            {
                bgTask = UIBackgroundTaskInvalid;
            }
        });
    });


- (void)startTime{
    __block int timeout = 60; //倒计时时间
    
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);
    dispatch_source_set_timer(_timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒执行
    dispatch_source_set_event_handler(_timer, ^{
        
        if(timeout<=0){ //倒计时结束,关闭
            dispatch_source_cancel(_timer);
            dispatch_async(dispatch_get_main_queue(), ^{
                //定时结束后的UI处理
            });
        }else{
            NSLog(@"时间 = %d",timeout);
            NSString *strTime = [NSString stringWithFormat:@"发送验证码(%dS)",timeout];
            NSLog(@"strTime = %@",strTime);
            dispatch_async(dispatch_get_main_queue(), ^{
                //定时过程中的UI处理
            });
            
            timeout--;
        }
    });
    dispatch_resume(_timer);

}


版权声明:本文为博主原创文章,未经博主允许不得转载。

iOS程序进入后台后仍运行定时器NSTimer

最近再做一个类似于“驾考宝典”的iOS应用,当然作为考试计时的功能肯定不会少,开发期间也是遇到各种各样的小问题,本文所讲为其中之一:iOS程序进入后台后十分钟之内就会被系统kill掉,怎么解决呢?我想...
  • Su_tianbiao
  • Su_tianbiao
  • 2015年11月10日 00:01
  • 3850

IOS中定时器NSTimer的开启与关闭

调用一次计时器方法: myTimer = [NSTimer scheduledTimerWithTimeInterval:1.5 target:self selector:@selector(scr...
  • enuola
  • enuola
  • 2012年10月22日 16:58
  • 159128

ios开发——日常之iOS程序进入后台后仍可运行定时器

其精髓就是:利用苹果给出的三种类型的程序可以保持在后台运行:音频播放类,位置更新类,另外一个记不太清楚了,我利用了苹果给出的音频播放类的这个“特权”来满足我程序上的要求,详细步骤如下: 步骤一:在I...
  • zzzzzdddddxxxxx
  • zzzzzdddddxxxxx
  • 2016年06月27日 16:07
  • 1328

iOS关于定时器的四个实用demo

关于iOS定时和延时的四个实用方法,附有demo,代码简单易懂,便于移植
  • xiongbaoxr
  • xiongbaoxr
  • 2016年01月25日 17:21
  • 1589

iOS程序进入后台后仍运行定时器

最近再做一个iOS应用,拥有考试计时的功能,开发期间也是遇到各种各样的小问题,本文所讲为其中之一:iOS程序进入后台后十分钟之内就会被系统kill掉,怎么解决呢?我想要程序进入后台后仍然运行计时功能,...
  • ABS1118
  • ABS1118
  • 2015年06月13日 16:33
  • 842

GCD实现倒计时且后台运行不影响计数

利用苹果给出的三种类型的程序可以保持在后台运行:音频播放类AVFoundation 在Build Phases添加依赖库   1、步骤一:在Info.plist中,添加"Required bac...
  • rabewu
  • rabewu
  • 2016年03月29日 15:53
  • 1223

【读书笔记】iOS-GCD-block-后台运行

当一个app按home键退出的时候,只有最多5秒的时间做一些保存或清理资源的工作。但是调用beginBackgroundTaskWithExpirationHandler方法,可以最多有10分时间在后...
  • fanqingtulv
  • fanqingtulv
  • 2015年07月23日 21:19
  • 621

NSTimer计时器后台运行的解决方法

思路: 切换至后台计时器暂停,记录下当前时间,切换回前台计时器回复,计算中间时间差 [[NSNotificationCenter defaultCenter] addObserver:self s...
  • lqzitongyezu
  • lqzitongyezu
  • 2016年08月10日 17:25
  • 1768

[iOS]各种定时器--最全的定时器使用

说到定时器, 我们使用最多的就是NSTimer 和 GCD 了, 还有另外一个高级的定时器 CADisplayLink;一. NSTimerNSTimer的初始化方法有以下几种: 会自动启动, 并加...
  • lqq200912408
  • lqq200912408
  • 2017年01月01日 00:00
  • 2636

封装一个GCD定时器,彻底解决定时器循环引用、释放时机问题

相信大家在开发中都会使用到定时器, 但又常常对定时器的循环引用问题, NSTimer 释放时机的选择上,劳神费力! 读了本文,这些再也不是问题! 关于 NSTimer 创建定时器的方法,我就不多做描...
  • zxw_xzr
  • zxw_xzr
  • 2017年03月29日 18:50
  • 1923
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS GCD创建标准定时器,进入后台后任可继续定时
举报原因:
原因补充:

(最多只允许输入30个字)