Pull to refresh

Comments 12

Скажите, пожалуйста, а зачем по таймеру на каждую задачу? Ведь все таймеры в данном случае делают одно и тоже. Почему бы просто не проходить раз в секунду по всем элементам и обновлять значение?
Там и есть только один таймер, который обновляет временные метки всех задач.
а как тогда вот это понимать:
Увеличение количества таймеров приводит к худшей отзывчивости UI и большему потреблению батареи. Каждый таймер пытается исполниться точно в отведённое ему время, так как по умолчанию его допуск (tolerance) равен нулю.
?
А чуть ниже, в том же разделе написано:

Запустите приложение. В этом конкретном случае эффект будет неочевиден (у нас только один таймер), однако в реальной ситуации нескольких таймеров ваши пользователи получат более отзывчивый интерфейс и приложение будет более энергоэффективным.


Посмотрите повнимательнее логику создания таймера и метод, который который он вызывает при срабатывании, все станет ясно.

таймер в данной статье порождает retain-цикл, т.к. таймер имеет сильную ссылку на target

В данном случае это не играет важной роли, так как у него всего один контроллер.
Спасибо за перевод!

Небольшое уточнение:
у каждого потока ест автоматически созданный для него цикл выполнения

Насколько мне известно runloop будет создан у потока, только после вызова currentRunLoop (класса Runloop) на этом потоке. Если не сделать этого и не вызвать run() у currentRunLoop то таймер на этом потоке работать не будет.

Кусочек оригинального текста проскочил:
updateAnimation() is now called every time the animation timer fires.

чтобы мы могла правильно
Спасибо, огрехи поправил! Что касается RunLoop, то пример, рассматриваемый в оригинальной публикации, вполне рабочий, я его повторил, конечно.
Да, я забыл сказать, что у main thread runloop будет запущен. Runloop не будет создан на других потоках (созданных вручную или используемых глобальными очередями GCD)
Примеры из публикации корректны, я просто дополнил
Подскажите плиз, какой самый не костыльный способ в Swift'е для работы с таймером по типу pause/resume?
«Из коробки» у таймера нет функционала pause/resume. Из этого следует вывод, что на «паузе» нужно делать invalidate() (если он добавлен в RunLoop) и обнулять его, а на «возобновить» — создавать его вновь, учитывая состояние, в котором он был в момент паузы.
Sign up to leave a comment.

Articles