美文网首页
GCD进入后台继续运行

GCD进入后台继续运行

作者: iYeso | 来源:发表于2019-10-28 20:11 被阅读0次

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

//
//  ViewController.m
//  Created by mac on 2017/9/6.
//  Copyright © 2017年 mac. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    
    [self startTime];
    
    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);
    
}

相关文章

  • GCD进入后台继续运行

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

  • iOS 验证码倒计时后台任务执行

    验证码无论是用NSTimer还是GCD都无法实现在点击home按键后继续执行 由于iOS系统为“伪后台”运行模式,...

  • iOS后台模式借助位置更新实现

    需求:iOS系统下使我们的app在后台下(点击Home键进入后台)仍能继续运行任务. 阅读前提: 了解后台任务机制...

  • 关于如何在进入后台后继续运行

    由于修改Bug,需要用到这个,暂时找的一些资料,未做整理。Bug是要让NSTimer在进入后台之后继续计时 NST...

  • docker

    进入后台运行的容器

  • iOS中多线程之GCD应用

    GCD通过把计算密集型任务放于后台运行,以此提高APP的响应速度。 GCD提供了更简单的并发模型,它优于线程锁,并...

  • GCD多线程

    GCD优点: 1.GCD 本身自带有线程锁的效果,能通过推迟昂贵计算任务并在后台运行它们来改善应用的响应性能。 2...

  • iOS程序后台问题

    程序运行时,按下Home键,程序进入后台,据实际测试程序代码还在执行,应该还会继续运行一小段时间(10 分钟)。当...

  • NSTimer在后台休眠问题

    当app在后台时保持NSTimer继续运行

  • iOS进入后台后持续运行

    参考: iOS后台运行180s https://www.jianshu.com/p/47ff7c239ba2 iO...

网友评论

      本文标题:GCD进入后台继续运行

      本文链接:https://www.haomeiwen.com/subject/zgjicftx.html