程序员

iOS定时器的三种方法

2019-03-26  本文已影响0人  Mr姜饼

说到定时器  也许大家并不陌生,可能大家都只是对NSTimer比较熟悉吧,那么久来为大家介绍另外两种不常见的方法吧

1.NSTimer(详细的就不给大家介绍了)

+ (NSTimer*)timerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation*)invocation repeats:(BOOL)yesOrNo;

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

注意:上面俩方法创建的timer需要将timer注册到NSRunloop中才能开启定时器的功能

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

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

+ (NSTimer*)scheduledTimerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation*)invocation repeats:(BOOL)yesOrNo;

ps:默认将timer添加到当前runloop中了,所有无需添加

2. dispatch_source_create()

简单地分为几个步骤 下面慢慢来讲解

注意:这里创建的timer并需要设置为全局属性,因为GCD会自动管理内存,当回收的时候,你发现timer不起作用,就很尴尬了😂

@property  (nonamatic , strong ) dispatch_source_t  timer;

  _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());

    dispatch_source_set_timer(_timer, DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC, 1 * NSEC_PER_SEC );

    dispatch_source_set_event_handler(_timer, ^{

        flag ++;

        NSLog(@"flag = %d",flag);

    });

添加执行事件代码。

    dispatch_resume(_timer);

手动触发

3.CADisplayLink

CADispalyLink displayLink = [CADisplayLink displayLinkWithTarget:selfselector:@selector(handleDisplayLink:)];

 [displayLink addToRunLoop:[NSRunLoopcurrentRunLoop] forMode:NSDefaultRunLoopMode];  

较为精准,与屏幕刷新帧率同步,多用户视图渲染或绘图

上一篇下一篇

猜你喜欢

热点阅读