关于定时器

2017-10-02  本文已影响3人  攻克乃还_
1.NSTimer的创建
[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES];

// 如果在子线程中调用改方法,不会执行,因为子线程runloop必须手动开启:
dispatch_async(dispatch_get_global_queue(0, 0), ^{ 
_timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(repeat:) userInfo:@{@"key":@"value"} repeats:true]; 
// 子线程runloop手动开启
[[NSRunLoop currentRunLoop] run]; 
});
NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES];
[runloop addTimer:timer forMode:NSDefaultRunLoopMode];
- (instancetype)initWithFireDate: interval: target: selector: userInfo: repeats:
- (void)initWithFireDate: interval: repeats: block:
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
2.NSTimer与Runloop:
// 默认模式
kCFRunLoopDefaultMode
// 拖动模式
UITrackingRunLoopMode
// 此模式包含了以上两种模式
kCFRunLoopCommonModes
3.NSTimer的循环引用
4.如何解决循环引用

4.1.控制器不再引用NSTimer
4.2.NSTimer不再引用控制器

- (void)fire;
// 要在dealloc方法调用之前销毁NSTimer
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    if (timer.isValid) {
    // 从runloop中销毁,销毁系统对于NSTimer的强引用
    [_timer invalidate];
    // 将属性置空销毁,销毁self对于NSTimer的强引用
    _timer = nil;
}
}
.5.GCD定时器
#import "ViewController.h"

@interface ViewController ()
/** 定时器属性 */
@property (nonatomic, strong) dispatch_source_t timer;
@end

@implementation ViewController

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    //1.创建GCD中的定时器
    /*
     第一个参数: source的类型DISPATCH_SOURCE_TYPE_TIMER 表示是定时器
     第二个参数: 描述信息,线程ID
     第三个参数: 更详细的描述信息
     第四个参数: 队列,决定GCD定时器中的任务在哪个线程中执行
     */
    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(0, 0));
    
    //2.设置定时器(起始时间|间隔时间|精准度)
    /*
     第一个参数:定时器对象
     第二个参数:起始时间,DISPATCH_TIME_NOW 从现在开始计时
     第三个参数:间隔时间 2.0 GCD中时间单位为纳秒
     第四个参数:精准度 绝对精准0
     */
    dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 2.0 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);
    
    //3.设置定时器执行的任务
    dispatch_source_set_event_handler(timer, ^{
        NSLog(@"GCD---%@",[NSThread currentThread]);
    });
    
    //4.启动执行
    dispatch_resume(timer);
    
    self.timer = timer;
}
@end

6.CADisplayLink定时器

self.displayLink = [CADisplayLink displayLinkWithTarget:self sel:ector:@selector(handleDisplaylink:)]; 
[self.displayLink addToRunLoop:[NSRunLoop curentRunLoop] forMode:NSDefaultRunLoopMode];
[self.displayLink invailidate];
self.displayLink = nil;
上一篇 下一篇

猜你喜欢

热点阅读