多个NSTimers问题

时间:2014-05-28 10:03:29

标签: objective-c macos cocoa

我已经对一个组件进行了细分(它看起来像圆圈,里面有一张图片(NSView子类))。

我想每隔X次更改一次图片(使其看起来像动画)。

当我在主视图控制器中绘制1个这样的子类时,一切正常,但是当我添加更多时,每个图片的变化都会更快。

(我正在使用NSTimer解决图片更改) 我假设问题发生是因为我在同一个队列上有多个NSTimers

但我尝试使用

NSTimer *uiTimer = [NSTimer timerWithTimeInterval:(1.0 / 5.0) target:self selector:@selector(changePicture) userInfo:nil repeats:YES];      
[[NSRunLoop mainRunLoop] addTimer:uiTimer forMode:NSRunLoopCommonModes];

它没有解决问题(我假设因为它仍然在主线程上) 所以我想出了NSThread解决方案

[NSThread detachNewThreadSelector:@selector(updateModel) toTarget:self withObject:nil];


- (void) updateModel
  {

  [NSTimer scheduledTimerWithTimeInterval:secondsBetweenUpdates 
                                    target:self 
                                    selector:@selector(changePicture) 
                                    userInfo:nil 
                                    repeats:YES];
    [[NSRunLoop currentRunLoop] run];
    }

它有一些不同的行为(但是因为更快的图片更改所以我有更多的子类,所以仍然没有运气。)

我的最后一次拍摄是这个解决方案:

// Update the UI 5 times per second on the main queue
// Keep a strong reference to _timer in ARC
_timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,     dispatch_get_main_queue());
dispatch_source_set_timer(_timer, DISPATCH_TIME_NOW, (1.0 / 5.0) * NSEC_PER_SEC, 0.25 * NSEC_PER_SEC);

dispatch_source_set_event_handler(_timer, ^{
[self changePicture];
});

// Start the timer
dispatch_resume(_timer);

我通常不会放弃,但我已经尝试解决它已经3天了......而且我认为我需要并建议如何做到这一点,以便按预期工作。

1 个答案:

答案 0 :(得分:1)

如果您使用的是GCD,我建议您使用dispatch_after,例如:

float delayTime = 0.2f;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW,
                             (int64_t)(delayTime * NSEC_PER_SEC)),
               dispatch_get_main_queue(), ^{
    [self changePicture];
});