/ / Випуск декількох НСТімерів - target-c, macos, какао

Випущено декілька NSTimers - objective-c, macos, какао

Я підкласифікував компонент (він схожий на коло і всередині нього є зображення (підклас NSView)).

Я хочу змінювати картину кожен раз (щоб вона виглядала як анімація).

Коли в моєму головному контролері перегляду я малюю 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 для відповіді № 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];
});