Это результат «объединения таймера», при котором «задержка» для отправляемого блока составляет 10% задержки, максимум до одной минуты задержки. (Это скрыто в коде libdispatch .) Это функция энергосбережения, позволяющая объединять / группировать удаленные, независимо запланированные задачи для одновременного запуска, чтобы избежать ненужного раскручивания оборудования слишком много раз. Самый простой способ избежать этого объединения - использовать повторяющийся таймер:
var counter = 0
Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { [weak self] timer in
counter += 1
guard let self = self, counter <= 150 else {
timer.invalidate()
return
}
self.view.backgroundColor = UIColor(red: .random(in: 0...1),
green: .random(in: 0...1),
blue: .random(in: 0...1),
alpha: 1)
let ymd = self.myCalendar.dateComponents([.second], from: Date())
print(ymd)
}
Обратите внимание на использование шаблона [weak self]
, чтобы таймер не сохранял постоянную ссылку на контроллер представления. И с этим оператором guard
мы будем invalidate
таймер, если контроллер представления отклонен.
Кстати, если вы хотите, чтобы изменение цвета было менее резким, анимируйте изменение:
var counter = 0
Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { [weak self] timer in
counter += 1
guard let self = self, counter <= 150 else {
timer.invalidate()
return
}
UIView.animate(withDuration: 0.1) {
self.view.backgroundColor = UIColor(red: .random(in: 0...1),
green: .random(in: 0...1),
blue: .random(in: 0...1),
alpha: 1)
}
...
}