我已经对一个组件进行了细分(它看起来像圆圈,里面有一张图片(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天了......而且我认为我需要并建议如何做到这一点,以便按预期工作。
答案 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];
});