IOS线程数据篇1之NSTimer定时器要注意的地方

来源:互联网 发布:美国签证 知乎 编辑:程序博客网 时间:2024/06/04 18:28

定时器是IOS中非常重要的一个部分,但是我们平时在使用的时候经常容易一些问题。

在不同线程中定时器的使用

定时器的精度

定时器的启动

计数时间使用的方法

先来看两种情况:

(1)主线程中使用定时器

ViewDidLoad:

        NSTimer *timer = [NSTimerscheduledTimerWithTimeInterval:25.0target:selfselector:@selector(socketkeepavlietimeoutaction:)userInfo:nilrepeats:YES];;

这样使用是没有任何问题的,因为默认情况下主线程会默认自动创建一个RunLoop,这种情况下我们使用是不会有什么问题的,但是如果在子线程中使用定时器呢?如果直接使用上面的方法定时器是不会运行的。

(2)非主线程中使用定时器

例如:

    dispatch_queue_t que =dispatch_queue_create("cn.itcast.gcd2",DISPATCH_QUEUE_CONCURRENT);

    dispatch_async(que, ^{

        NSLog(@"设置keepalive超时时间的个数");

        FWSocketClientInfo *SKinfo = (FWSocketClientInfo *)[notiobject];

       NSTimer *timer = [NSTimerscheduledTimerWithTimeInterval:25.0target:selfselector:@selector(socketkeepavlietimeoutaction:)userInfo:nilrepeats:YES];;

        SKinfo.SocketKeepAliveTimer = timer;

        [[NSRunLoopcurrentRunLoop]addTimer:timerforMode:NSDefaultRunLoopMode];

        [[NSRunLoopcurrentRunLoop]run];

    });

    };

这里创建了一个子线程,定时器是在子线程中运行的,必须要将定时器加到所有的RunLoop中。并且执行这个RunLoop。这样定时器才会正确的执行。

(3)定时器的精度问题

这里尤其需要注意的是,比如我们想展示多帧动画 甚至视频,如果你想定时器来控制每帧图片的显示,那是很不现实的,定时器只能在一定程度上比如精确到秒的级别。而视频,如常见的30FPS,每帧图片时间间隔只有60ms左右,定时器用在这里是很不合适的。

(4)启动

点击NSTimer的方法可以看到:


尤其是要注意最后一句,如果设置成YES,那么定时器会按照设定的定时时间开始执行,每次定时间到都会执行这个语句,如果设置为NO,那么只有调用

[timer fire]

定时器才会执行。即使设置为YES属性,这里如果调用[timer fire]也会立即执行,而不会等到定时时间到了之后才执行,想让代码在一段延迟时间之后只执行一次,那么可以将这个属性设置为YES,执行一次之后 调用[timer

invalidate]取消这个定时器的使用。

(5)如果我们有的时候想获取一些时间间隔

那么还有一些比较简单的方法

如:

timeOutMark=[NSDatedate];

NSTimeInterval timeInterval=[timeOutMarktimeIntervalSinceNow];


这里获取的是两行代码的时间之差,注意一点这里得到的是负数。


0 0