NSTimer

作者: mjf | 来源:发表于2016-12-13 10:26 被阅读0次

    //关闭 - 永久关闭

    [timer invalidate];

    //暂时定时器

    [myTimer setFireDate:[NSDate distantFuture]];

    //开启定时器

    [myTimer setFireDate:[NSDate distantPast]];

    timer不是一种实时的机制,会存在延迟,而且延迟的程度跟当前线程的执行情况有关。

    我们通常在主线程中使用NSTimer,有个实际遇到的问题需要注意。当滑动界面时,系统为了更好地处理UI事件和滚动显示,主线程runloop会暂时停止处理一些其它事件,这时主线程中运行的NSTimer就会被暂停。解决办法就是改变NSTimer运行的mode(mode可以看成事件类型),不使用缺省的NSDefaultRunLoopMode,而是改用NSRunLoopCommonModes,这样主线程就会继续处理NSTimer事件了。具体代码如下:

    NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timer:) userInfo:nil repeats:YES];

    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

    前面的例子中我们使用的是一种便利方法,它其实是做了两件事:首先创建一个timer,然后将该timer添加到当前runloop的default mode中。也就是这个便利方法给我们造成了只要创建了timer就可以生效的错觉,我们当然可以自己创建timer,然后手动的把它添加到指定runloop的指定mode中去。

    NSTimer其实也是一种资源,如果看过多线程变成指引文档的话,我们会发现所有的source如果要起作用,就得加到runloop中去。

    每一个线程都有它自己的runloop,程序的主线程会自动的使runloop生效,但对于我们自己新建的线程,它的runloop是不会自己运行起来,当我们需要使用它的runloop时,就得自己启动。

    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

    // 打开下面一行输出runloop的内容就可以看出,timer却是已经被添加进去

    //NSLog(@"the thread's runloop: %@", [NSRunLoop currentRunLoop]);

    // 打开下面一行, 该线程的runloop就会运行起来,timer才会起作用

    //[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:3]];

    http://www.cnblogs.com/smileEvday/archive/2012/12/21/NSTimer.html

    相关文章

      网友评论

          本文标题:NSTimer

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