美文网首页
ios 定时器NSTimer

ios 定时器NSTimer

作者: 颜小宋 | 来源:发表于2018-11-29 16:23 被阅读0次

首先,定时器的创建比较常用的有两种

+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo;
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo;

但timerWithTimeInterval在创建时需要手动加入runloop,

NSTimer *timer = [NSTimer timerWithTimeInterval:3 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];
// 加入RunLoop中
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

需要注意的是:UIScrollView在滑动时NSDefaultRunLoopMode,UITrackingRunLoopMode会被挂起,定时器就会暂停,如果不需要在滑动时定时器暂停,可以将mode设为NSRunLoopCommonModes

定时器的释放方法

[timer invalidate];
timer = nil;

在进入后台时若想计时器不停的处理:
1、在不更改系统时间的前提下,可监听进入后台和进入前台的消息,在进入后台时存下时间戳,停掉定时器,在进入前台时计算时间差。重新开启定时器
2、
步骤一
在info里面如下设置:
info -->添加 Required background modes -->设置 App plays audio or streams audio/video using AirPlay


2725608-d27856df9423ca93.png

步骤二
在AppDelegate.m里面调用

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    /*定时器后台运行*/
    NSError *setCategoryErr = nil;
    NSError *activationErr  = nil;
    /*设置Audio Session的Category 一般会在激活之前设置好Category和mode。但是也可以在已激活的audio session中设置,不过会在发生route change之后才会发生改变*/
    [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: &setCategoryErr];
    /*激活Audio Session*/
    [[AVAudioSession sharedInstance] setActive: YES error: &activationErr];
 }

/*
 通过UIBackgroundTaskIdentifier可以实现有限时间内在后台运行程序
 程序进入后台时调用applicationDidEnterBackground函数,
 */
- (void)applicationDidEnterBackground:(UIApplication *)application{
    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;
            }
        });
    });
}

参考链接
NSTimer的基础用法以及程序挂起后NSTimer仍然可以在后台运行计时

相关文章

  • 无标题文章

    iOS NSTimer使用详解-开启、关闭、移除 定时器定时器详解ios定时器关闭定时器NSTimer 1、要使用...

  • iOS NSTimer 和 GCD 定时器及封装

    iOS NSTimer 和 GCD 定时器及封装 iOS NSTimer 不准时 NSTimer 内部是有 run...

  • 定时器的使用介绍

    iOS中的定时器大致分为这几类: NSTimer CADisplayLink GCD定时器 (一)NSTimer ...

  • iOS常用定时器误差分析

    iOS中常NSTimer、CADisplayLink、GCD定时器,其中NSTimer、CADisplayLink...

  • 2018-06-12

    ios 开发定时器-NSTimer的简介 1. NSTimer 其实就是CFRunLoopTimerRef,在ru...

  • iOS GCD定时器的封装

    iOS中有三种定时器,NSTimer、CADisplayLink以及GCD。因为NSTimer和CADisplay...

  • app后台运行

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

  • iOS中的定时器

    点击这里>> cocoaChina: iOS中的定时器 iOS中定时器有三种,分别是NSTimer、CADispl...

  • GCD定时器使用

    iOS中的常用定时器分为这几类: NSTimer CADisplayLink GCD定时器 选择GCD定时器原因:...

  • iOS 定时器

    iOS常用定时器有3种 NSTimer GCD定时器 dispatch_source_t CADisplayLin...

网友评论

      本文标题:ios 定时器NSTimer

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