Анимация UIView не застревает, но UIButton застревает при блокировке основного потока

#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», в котором кратко объясняется, почему анимация настроена так, чтобы не прерывать основной поток.