Я бы порекомендовал против КВО для этой проблемы. Это вносит много сложности (и несколько раздражающих ошибок) для небольшой выгоды здесь. KVO важен в тех случаях, когда вам необходимо обеспечить абсолютно минимальные накладные расходы. Apple часто использует его для низкоуровневых высокопроизводительных объектов, таких как слои. Это единственное общедоступное решение, которое предлагает нулевые накладные расходы, когда нет наблюдателя. В большинстве случаев вам это не нужно. Правильная обработка KVO может быть сложной задачей, и ошибки, которые он может создать, раздражают, чтобы выследить.
В вашем делегатском подходе нет ничего плохого. Это правильно MVC. Единственное, о чем вам нужно беспокоиться, это то, что NSTimer не дает серьезных обещаний, когда его вызывают. В некоторых случаях повторяющийся таймер может даже пропустить. Чтобы избежать этой проблемы, вы обычно рассчитываете elapsedTime
на основе текущего времени, а не увеличивая его. Если таймер может сделать паузу, вам нужно сохранить аккумулятор и дату «когда я в последний раз».
Если вам нужны более точные или более дешевые таймеры, вы можете посмотреть на dispatch_source_set_timer()
, но для простого секундомера, ориентированного на человека, NSTimer
подойдет и отличный выбор для простого проекта.