美文网首页
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

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