LeadKit/TIFoundationUtils/TITimer
Ivan Smolin 4c7b7a76c1 feat: add AsyncOperation - generic subclass of Operation with chaining and result observation support 2022-02-15 21:30:27 +03:00
..
Sources/TITimer feat: add AsyncOperation - generic subclass of Operation with chaining and result observation support 2022-02-15 21:30:27 +03:00
README.md feat: add AsyncOperation - generic subclass of Operation with chaining and result observation support 2022-02-15 21:30:27 +03:00

README.md

TITimer

Pretty timer

Эта библиотека позволяет создавать таймер, который работает как с RunLoop'ом , так и с GCD.

Особенности

  • Учитывает время проведенное приложением в background состоянии. Детали - TimerRunMode
  • Можно создавать таймер на собственной очереди или на необходимом режиме Runloop'а. Детали - TimerType

Runloop.main vs GCD

Особенности работы таймера с Runloop.main

  • Runloop есть у каждого потока, но сразу запущенный только у главного - Runloop.main
  • Устанавливая таймер для конкретного режима Runloop.main, мы получаем события в eventHandler, только когда Runloop находится в данном состоянии
  • Runloop.main может работать в трех режимах:
    • traking - когда активно взаимодействуем с приложением, например, скроллим таблицу
    • default - все остальные состояния отличные от traking
    • common - включает в себя обработку событий и traking, и default

Особенности работы таймера с GCD

  • Вызов метода eventHandler будет происходить на той же очереди, на которую добавили
  • Eсли хотите обновлять UI, то необходимо быть уверенным, что перевели выполнение на главную очередь!

Что выбрать

  • Используйте Runloop.main, когда необходимо обрабатывать события таймера на главном потоке, например, обновлять UI
  • Используйте GCD, если обработка событий таймера не требует работы с UI или она слишком ресурсоёмкая и не хотите нагружать главный поток
  • Вы также можете создать свой поток и Runloop, но эта ситуация слишком редкая в повседневной разработке, что рассматривать её не будем

В 90% случаев достаточно использовать упрощенный инициализатор, который использует Runloop.main с режимом common - TITimer(mode: TimerRunMode).

Примеры

Упрощенная инициализация

timer = TITimer(mode: .onlyActive)
timer = TITimer(mode: .activeAndBackground)

Runloop.main

timer = TITimer(type: .runloopTimer(runloop: .main, mode: .common), mode: .onlyActive)

GCD

timer = TITimer(type: .dispatchSourceTimer(queue: .main), mode: .activeAndBackground)

Возможные активности

timer.eventHandler = {
   // Получаем события
}
        
timer.start() // Запустить таймер
timer.pause() // Останавливаем таймер
timer.resume() // Возобновляем его работу
timer.invalidate() // Уничтожаем таймер