#ios #swift #multithreading #animation #swift3
#iOS #swift #многопоточность #Анимация #swift3
Вопрос:
У меня есть простой анимированный прямоугольник на экране, сгенерированный в коде.
let rect = UIView()
self.view.addSubview(rect)
rect.backgroundColor = UIColor.black
rect.frame = CGRect(x: 0, y: 0, width: 50, height: 50)
UIView.animate(withDuration: 2, delay: 0.0, options: [.autoreverse, .repeat], animations: {
rect.frame = CGRect(x: 100, y: 100, width: 50, height: 50)
}, completion: { finished in
})
На экране есть две кнопки: одна срабатывает self.didPressStuckIt
, а другая срабатывает self.didPressDoNotStuckIt
. Я намереваюсь приостановить анимацию, запустив имитацию тяжелых вычислений в главном потоке, и не приостанавливать анимацию, когда я запускаю тяжелые вычисления в другом потоке.
@IBAction func didPressStuckIt(_ sender: UIButton) {
let runId = arc4random_uniform(10000000)
sleep(4)
statusLabel.text = "Status: didPressStuckIt Completed ((runId))"
}
@IBAction func didPressDoNotStuckIt(_ sender: UIButton) {
let runId = arc4random_uniform(10000000)
let queue = DispatchQueue(label: "myqueue", qos: .default, attributes: .concurrent, autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency.never, target: nil)
queue.async {
sleep(4)
DispatchQueue.main.async {
self.statusLabel.text = "Status: didPressDoNotStuckIt Complted ((runId))"
}
}
}
Когда я запускаю didPressDoNotStuckIt
, все работает так, как я ожидал. Сама кнопка работала в обычном режиме, и анимация продолжала продолжаться.
Странная часть didPressStuckIt
. Кнопка застряла и не отвечала, поскольку вычисление блокировало основной поток, но анимация все еще выполнялась гладко.
Кто-нибудь может объяснить, почему анимация не застряла?
Комментарии:
1. Привет, Джон — насколько я понимаю, Apple использует выделенный сервер анимации, который работает в своем собственном потоке.
2. Смотрите developer.apple.com/library/content/documentation/WindowsViews / … , в частности, раздел, озаглавленный «Запуск анимации с использованием методов Begin / Commit», в котором кратко объясняется, почему анимация настроена так, чтобы не прерывать основной поток.