gpt4 book ai didi

swift - 创建一个用于执行动画的等待队列

转载 作者:行者123 更新时间:2023-11-28 07:35:39 25 4
gpt4 key购买 nike

我目前正在制作快速动画。此动画在不稳定的时间间隔内由另一个函数触发(连接到服务器)。动画需要 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()
}
}
}
}

最佳答案

你可以尝试像下面的例子那样制作你的动画队列

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
}
}
}

关于swift - 创建一个用于执行动画的等待队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53226266/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com