iOS:单独线程上的计时器动画

时间:2013-09-14 18:23:09

标签: ios cocoa-touch nstimer

我有一个简单的动画,使标签看起来像向上计数,我把它放在计时器中。

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.01f target:self selector:@selector(animateScore:) userInfo:nil repeats:YES];
    [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

动画分数选择器会增加标签文本,直到达到所需的整数,然后使计时器无效。

现在,它会在其他UI内容停止时停止,例如重新加载表格视图部分。

我尝试运行此代码,但它不起作用:

   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

     NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.01f target:weakSelf selector:@selector(animateScore:) userInfo:nil repeats:YES];

      [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
     }); 

2 个答案:

答案 0 :(得分:2)

执行此操作的首选方法是使用特殊的计时器类CADisplayLink,每次更新设备的屏幕时都会触发该类。类似的东西:

@property (nonatomic, strong) CADisplayLink *displayLink;

-(void)viewDidLoad {
    // …
    self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkDidFire:)];
    [self.displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
    // …
}

-(void)displayLinkDidFire:(CADisplayLink *)displayLink {
    // Update label text
}

答案 1 :(得分:1)

scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:已将计时器添加到当前运行循环(由于您在后台队列上执行此循环,因此可能不是主运行循环)。 请改用timerWithTimeInterval:target:selector:userInfo:repeats:。这会创建计时器,但不会将其添加到当前运行循环中。