ios 定时器NSTimer

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

+ (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)