NSTimer работает путем добавления событий в очередь в главном цикле выполнения; это та же самая очередь событий, которая используется для сенсорных событий, событий ввода-вывода и т. д. Заданный интервал времени не является точным графиком; в основном на каждом проходе цикла выполнения таймеры проверяются, чтобы выяснить, должны ли они срабатывать.
Из-за того, как они реализованы, невозможно повысить приоритет таймера.
Похоже, ваш вторичный поток отнимает много процессорного времени у основного потока, и поэтому таймеры запускаются не так часто, как хотелось бы. Другими словами, основной поток истощен для процессорного времени.
Вызов performSelectorOnMainThread:
не обязательно поможет, потому что эти методы по существу добавляют таймер одиночного запуска в очередь событий основного потока. Так что вы просто будете устанавливать таймеры по-другому.
Чтобы исправить вашу проблему, я бы посоветовал вам увеличить относительный приоритет основного потока на , уменьшив приоритет вашего вычислительного потока . (См. [NSThread setThreadPriority:]
.)
Может показаться нелогичным, что ваш важный рабочий поток работает с более низким приоритетом, чем основной поток, который просто рисует материал на экране, но в удобном для человека приложении, поддерживает экран в актуальном состоянии и отвечает для пользовательского ввода обычно самое важное, что должно делать приложение.
На практике основному потоку требуется очень мало ЦП, поэтому он не будет сильно замедлять ваш рабочий поток; скорее вы просто гарантируете, что в течение небольшого промежутка времени, когда основной поток должен что-то сделать, он будет выполнен быстро.