Является ли добавление Timer в основной RunLoop правильным решением? - PullRequest
0 голосов
/ 26 октября 2018

У меня есть таймер, который я хочу непрерывно повторять через заданный интервал, однако единственный способ сохранить таймер - добавить его в RunLoop.main, как показано ниже:

let timer = Timer(timeInterval: timeInterval, repeats: true) { (timer) in
    blockToFire()
}
RunLoop.main.add(timer, forMode: .commonModes)

Я понимаю, что использование .commonModes должно препятствовать тому, чтобы таймер пропускал свою реплику, когда пользователь взаимодействует с пользовательским интерфейсом, но вызовет ли таймер проблемы при добавлении в основной цикл выполнения?Будут ли замедления пользовательского интерфейса?

1 Ответ

0 голосов
/ 26 октября 2018

Код, который вы разместили, в порядке.Runloop связан с конкретным потоком.Таймеры обычно запускаются в основном потоке / главном цикле выполнения.Таким образом, они будут вызывать «икоты» в главном потоке, если их код выполняется слишком долго.Не вызывайте блоки / селекторы, чей код требует много времени для запуска из основного потока / присоединения их к основному циклу выполнения, иначе вы вызовете замедление пользовательского интерфейса.

Вы также можете создать и запустить таймерна фоне темы.Обычно я использую один из методов scheduledTimer(), который создает таймер и добавляет его в «текущий цикл выполнения» (что означает цикл выполнения для текущего потока.)

Если вы хотите запустить таймерв другом потоке вы можете вызвать один из scheduledTimer() методов из вашего фонового потока.Однако помните, что вам не следует делать вызовы UIKit из фонового потока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...