在我的游戏中,每次用户向某个特定方向滑动时,屏幕上的某个东西都会动画化。由于每个动画大约需要一秒钟,所以如果用户快速滑动屏幕,我需要一种方法来“记录”滑动将触发的所有函数,并让它们在不断完成时串行执行。我认为队列非常适合这一点,在实现我自己的队列之前,我遇到了DispatchQueue
。这让我想知道是否有一种方法可以将DispatchQueue
与组和工作项结合使用,以便对函数进行排队,并使它们在完成时一个接一个地执行。
请让我知道DispatchQueue
是否可以用这种方式对函数进行排队。
我已经了解了.userInteractivity
全局队列,并且假设需要在那里做一些事情;我只是不知道是什么也不知道怎么做。
谢谢。
1条答案
按热度按时间eufgjt7s1#
尽管
DispatchQueue
看起来很吸引人,但它并不是您的用例的理想工具。调度队列是一种非常特殊的队列类型,一个以FIFO方式执行的代码块队列。不幸的是,调度队列在管理工作项之间的依赖关系方面并不十分优雅,这些依赖关系本身就是异步的。而且不用说,您的动画是异步的。
诚然,有一些(笨拙的)技术可以使GCD工作,但它不是最适合您的用例的解决方案。操作队列处理异步任务之间的依赖关系稍好一些,但不必要地复杂(需要创建定制的异步
Operation
子类,其中包含isExecuting
、isFinished
等所有适当的KVO通知)。正如您所建议的,一个非常简单的解决方案是拥有一个自己的FIFO队列,其中包含一些捕捉用户交互的模型对象:
Array
;append
值添加到该数组;removeFirst
从该数组中获取一个值;以及例如,在下面,我有一个
points
的队列/数组,表示用户在UI中点击的位置,并以FIFO方式动画显示视图的位置(为了保持代码片段简单,我在IB中创建了动画视图和点击手势识别器)。这里的细节并不十分相关,基本思想是可以使用
Array
作为用户输入的FIFO队列。如果您一心想使用某个框架对象来管理队列,那么可以考虑以下几点,完全跳过调度/操作队列。
async
-await
,它可以优雅地处理异步任务之间的依赖关系,参见WWDC 2021视频Meet async/await in Swift。AsyncSequence
,即AsyncChannel
(来自Swift Async Algorithms库)来提供一个异步序列,在该序列中,用户输入可以轻松地向现有序列添加新项。如果您不熟悉Swift concurrency,那么在深入研究
AsyncChannel
方法之前,您可能需要先熟悉它,但是如果您正在寻找处理一系列异步任务的最符合逻辑的模式,那么AsyncChannel
是值得考虑的。