Создать очередь ожидания для выполнения анимации
В настоящее время я работаю над быстрой анимацией. Эта анимация запускается другой функцией в нестационарных временных интервалах (подключается к серверу). Анимация занимает 2 секунды, но возможно, что она запускается до того, как закончится. Вот почему я думал о создании очереди ожидания, которая хранит инициирующие события, пока анимация не будет завершена и может быть перезапущена. Поэтому, с одной стороны, мне нужно заблокировать функцию анимации, пока она снова не будет готова, а с другой стороны, мне нужно какое-то хранилище для входящих событий. Я уже думал о диспетчерских группах, но не мог понять, как я могу их использовать. Я был бы очень рад любому вкладу, в каком направлении я мог бы пойти, чтобы решить эту проблему.
Функция запуска:
private func subscribeToNewBLock() {
DispatchQueue.global(qos:.userInteractive).async {
watchForNewBlock() {result in
switch result {
case .Failure:
return
case .Success(let result):
//Animation function
self.moveBlocksDown(blockNumber: result)
//Recursive call to keep listening for new blocks
self.subscribeToNewBLock()
}
}
}
}
1 ответ
Вы можете попытаться создать свою очередь анимации, как показано ниже
var results = [Int]()
var isAnimating = false
private func subscribeToNewBLock() {
DispatchQueue.global(qos:.userInteractive).async {
watchForNewBlock() {result in
switch result {
case .Failure:
return
case .Success(let result):
//Call your UI operations in main thread
DispatchQueue.main.async {
self.results.append(result)
//Animation function
self.moveBlocksDown()
//Recursive call to keep listening for new blocks
self.subscribeToNewBLock()
}
}
}
}
}
private func moveBlocksDown() {
guard isAnimating == false && results.count > 0 else {
return
}
self.moveBlocksDown(blockNumber: results.first!)
}
private func moveBlocksDown(blockNumber:Int){
isAnimating = true
UIView.animate(withDuration: 2.0, animations: {
//Animation code goes here
}) { (completed) in
if completed{
//Add follwing code in place of animation completed(May be in completion handler)
self.isAnimating = false
self.results = self.results.filter{$0 != blockNumber} //Remove already animated blockNumber
self.moveBlocksDown() //Call moveBlocksDown function to check if anything pending in queue
}
}
}