Используйте для этого CADisplayLink
.Срабатывает с частотой кадров системы: 60 кадров в секунду или 17 мс.
Если вам нужен более длинный интервал, вы можете настроить его на частоту кадров, например, каждый 2-й или 3-й кадр.
CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(timer1)];
displayLink.frameInterval = 2;
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
Он предназначен для пользовательского интерфейса, который должен обновлять каждые n кадров.
Не использовать dispatch_after
.Как следует из названия, единственной гарантией является то, что ваш блок будет исполнен после определенного времени.Если что-то блокирует поток, вашему блоку придется подождать.