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开发——日常之iOS程序进入后台后仍可运行定时器

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

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

步骤一:在Info.plist中,添加"Required background modes"键,value为:App plays audio 步骤二: - (BOOL)ap...

iOS申请持续的后台时间

由于苹果的后台机制,当我们按下home键的时候,所有线程包括主线程的任务都会被挂起,一些资源比如socket也会被系统回收,会导致很多问题,比如一个很重要的资源中断下载,或者定时器方法被暂停等等。 ...

NSTimer、CADisplayLink、GCD 三种定时器的用法

在软件开发过程中,我们常常需要在某个时间后执行某个方法,或者是按照某个周期一直执行某个方法。在这个时候,我们就需要用到定时器。 在iOS中有很多方法完成定时器的任务,例如 NSTimer、CAD...

从NSTimer的失效性谈起(二):关于GCD Timer和libdispatch

一、GCD Timer的创建和安放虽然GCD Timer并不依赖于NSRunLoop,但是有没有可能在某种情况下,GCD Timer也失效了?就好比一开始我们也不知道NSTimer对应着一个runlo...

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

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

iOS学习笔记40-GCD定时器的实现

GCD定时器 GCD定时器不受RunLoop约束,比NSTimer更加准时 证明,实现GCD定时器 @interface ViewController () /** 定时...

iOS GCD定时器的使用

#import "ViewController.h"      @interface ViewController ()   {       dispatch_source_t _timer;...

GCD 保持iOS app后台长时间运行

GCD的另一个用处是可以让程序在后台较长久的运行。在没有使用GCD时,当app被按home键退出后,app仅有最多5秒钟的时候做一些保存或清理资源的工作。但是在使用GCD后,app最多有10分钟的时间...
  • zhtsuc
  • zhtsuc
  • 2017年01月14日 16:25
  • 198

iOS定时器 GCDTimer

iOS GCDTimer工具类的封装、可以下载直接使用,有问题相互学习。
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS GCD创建标准定时器,进入后台后任可继续定时
举报原因:
原因补充:

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