需要多个事件触发后才能执行方法的设计模式?

3
有很多时候我需要在一些事件触发后执行一些代码,我之前使用过计数器之类的方法,但是我感觉肯定有更好的办法。
例如,说有五个文件需要加载,之后一个UI组件才能被激活。
如果我设置了一个计数器,在每个文件被请求时递增,在每个文件加载后递减,那么就存在这么一种风险:前两个或三个文件可能在我的代码来不及请求第四个和第五个文件之前就完全加载完成了,这意味着当我还有两个文件需要加载时,我的计数器已经变成了零,从而会导致UI组件过早地激活。
有些情况下你可能知道在请求发送之前需要加载多少个文件,但是有可能第一个文件包含路径(因此是文件数), 这个文件加载的情况只是我试图解释的模式中的一个例子。
有没有什么优秀的解决方案?我的描述是否合理?谢谢!
4个回答

0

你可以使用类似 spicelib 的任务框架来完成一些操作。

以此为例:

  • 创建一个 FileRecursionLoadTask,它会获取一个文件,并在该文件及其引用的任何内容加载完成后完成。
  • 将每个 FileRecursionLoadTask 添加到 SequentialTaskGroup 中。
  • 当 TaskGroup 完成时,您就知道所有文件加载都已完成。

还有很多其他的任务框架,也许你会更喜欢其中的某一个。例如,Spring ActionScript 也有一个。


0
在执行请求之前,将引用(唯一的请求URI、加载器对象或特殊命令对象)存储在列表中。当加载器完成后,删除该对象并调用一个函数来检查列表中是否有剩余的活动任务。
这不是针对文件请求或请求的特定内容,它可以用于任何需要等待多个操作完成的情况。可以使用多个列表同时处理多种类型的操作。存储在列表中的对象可以实现为命令对象,它可以提供有关任务的更多信息。这被称为命令模式

0

如果你只是做加载,像Jacob一样,我建议使用一个来处理加载。

如果情况更复杂,比如混合加载器和其他事件监听器,我建议使用一个事件,每当任何依赖项发生任何更改时触发。此外,所有的对象/类都会有一个状态。

然后,我会为需要执行函数或启动函数的类创建一个添加监听器的函数,该函数将具有3个参数:

  • 带有事件分派器的对象(假设它们都使用相同的更新事件),即assetLoader
  • 对象状态的名称,即headerLoaded
  • 所需的状态值,即true

该函数将把监听器添加到一系列监听器中,每当任何一个监听器触发时,所有对象都会检查状态值。

这也将允许回归测试(例如当用户按下按钮时,内容开始加载,但是用户随后按下取消按钮,即使所有资源都已加载,一个对象的状态仍然为false,因此不允许完成该项操作)。如果您使用计数器,它将相当于加法而不是减法,但更可靠。


0

正在寻找设计模式吗?尝试一下命令模式(http://johnlindquist.com/2010/09/09/patterncraft-command-pattern/)。 (视频是命令模式的一个很好的例子,展示了它是如何工作的 - 以星际争霸为例。)

实现方式是将您的加载命令排队,以便它们不会无序执行,并且您可以将启用或禁用命令添加到您的命令队列中。因此,命令模式将像这样回放您的命令:加载、加载、加载、启用UI项目、加载、加载、启用另一个项目。

祝你好运!


很棒的链接。我认为问题不在于命令按正确顺序执行,而是控制器知道所有命令何时完成,无论它们何时开始。 - Daniel
好的,我明白了。但无论哪种方式,解决方案都是一样的。如果你将你的加载命令排成队列,并且知道它们何时完成,那么就没问题了。命令很灵活,因为你可以在中途添加事件,或者像你的情况一样,在命令队列为空时添加一个事件。有意义吗? - Plastic Sturgeon
我认为下面有一个人也建议了使用命令模式。观看上面的视频,我认为你会明白如何使用它来解决你的问题。 - Plastic Sturgeon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接