计时器 - NSTimer

类似计时的还有 GCD 和QuartzCore 的 CADisplayLink。

一般模式

  • 1 自动加入 runloop
// 每两秒 执行test 方法,附带参数,并且重复执行
    self.timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(test:) userInfo:@"userInfo" repeats:YES];

- (void)test:(NSTimer *)timer {
    NSLog(@"%@",timer.userInfo);
}
  • 2手动加入 runloop
    self.timer = [NSTimer timerWithTimeInterval:2 target:self selector:@selector(test:) userInfo:@"userinfo" repeats:YES];
 
// 加入 默认 当前 runloop,又要研究一下 runloop 啦
    [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSDefaultRunLoopMode];

延迟模式

// 指定时间 开始计时 调用,同样需要手动加入 runloop
    self.timer = [[NSTimer alloc] initWithFireDate:[NSDate dateWithTimeIntervalSinceNow:3] interval:2 target:self selector:@selector(test:) userInfo:@"userinfo" repeats:YES];
    
    [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSDefaultRunLoopMode];
    

信号模式

另外一篇写了一点点简单使用,并不是很深入。

  • 1 自动加入 runloop
- (NSString *)test:(NSString *)string {
    NSLog(@"%@",string);
    return [NSString stringWithFormat:@"%@ 元",string];
}

- (void)test {
    // 需要实现的方法
    SEL testSeletor = @selector(test:);
    
    // 方法签名
    NSMethodSignature *sig = [[self class] instanceMethodSignatureForSelector:testSeletor];
   
    // 调用 设置:目标信号,执行对象 与 方法
    NSInvocation *testInvocation = [NSInvocation invocationWithMethodSignature:sig];
    [testInvocation setTarget:self];
    [testInvocation setSelector:testSeletor];
    
    // 传入参数
    NSString *str1 = @"1212";
    [testInvocation setArgument:&str1 atIndex:2];
    
    // 回调 结果
    NSString *testResult = nil;
    [testInvocation retainArguments];
    [testInvocation invoke];
    [testInvocation getReturnValue: &testResult];
    
    // 打印 处理结果:即拼接字符串
    NSLog(@"%@",testResult);
    
    // 重复 执行的 是 方法内部的操作
    self.timer = [NSTimer scheduledTimerWithTimeInterval:2 invocation:testInvocation repeats:YES];
}
    
  • 2 手动加入 类似
    self.timer = [NSTimer timerWithTimeInterval:2 invocation:testInvocation repeats:YES];
    
    [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSDefaultRunLoopMode];
    
    

其他

[self.timer fire]; // 立即启动
[self,timer incalidate];// 停止
self.timer.tolerance = 0.1;// 允许误差,本身就有误差。
大致就是这样 

你可能感兴趣的:(计时器 - NSTimer)