Создать очередь ожидания для выполнения анимации

В настоящее время я работаю над быстрой анимацией. Эта анимация запускается другой функцией в нестационарных временных интервалах (подключается к серверу). Анимация занимает 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
        }
    }
}
Другие вопросы по тегам