【问题标题】:How to perform repetitive actions in PureMVC flex application?如何在 PureMVC flex 应用程序中执行重复操作?
【发布时间】:2012-01-25 02:56:03
【问题描述】:

目前正在开发一个基于 PureMVC 框架的 flex AIR 项目。项目有一个新的要求,一个操作要定期重复执行,有一定的业务逻辑。根据 PureMVC,这应该放在命令中,但是命令会在执行的那一刻被垃圾收集。

鉴于这种情况,几乎没有疑问/困惑/澄清......

  1. 使用业务逻辑创建命令将是一种解决方案......但是谁会在特定时间间隔触发它? (这不应该通过 PureMVC 的命令来完成)
  2. 将命令触发器放在中介器中或将逻辑放在中介器中(这会使 pureMVC 有点不纯:))

如何为这种情况找到解决方案?

【问题讨论】:

  • AFAIK 命令用于业务逻辑。所以我想你的意思是别的?为什么收集命令 geta 垃圾很重要?它需要存储状态吗?这就是模型的用途。或者它是否需要控制一个顺序异步进程?或者我们可能正在使用不同的业务逻辑定义。由于这是关于 PureMVC 我使用 PureMVC 最佳实践中的定义:puremvc.org/component/option,com_wrapper/Itemid,174
  • 您是正确的命令用于业务逻辑。我有一个要在后台运行的顺序异步进程。

标签: actionscript-3 apache-flex air puremvc


【解决方案1】:

您需要将要运行的异步进程和所述进程的重复触发分开。我的建议是为异步进程创建一个代理和一个单独的代理,它是一个定时器的包装器,它只是在超时时发送一个通知。通知耦合到一个命令,该命令又调用异步代理的方法。这样您就可以在命令中添加逻辑,例如如果进程仍然很忙该怎么办。

创建两个代理的好处:您遵守 SRP。您可以在不接触异步代理的情况下轻松交换/修改/删除计时代理。一切都很好地分开。

【讨论】:

    【解决方案2】:

    取决于 Command 应该做什么 - 如果它更新 Model 在您的 Proxy 类之一中放置一个 Timer 并每 xx 秒发送一个 Notification 映射到 Command它会做任何你想做的事情。

    如果它只是更新View,您可以将Timer 添加到相应的Mediator,但您根本不需要Command

    **

    不要创建超出您需要的单例。 ApplicationFacade 已经是其中之一 - 尝试保持这种状态。

    **

    如果您必须对后端进行任何异步调用,只需确保添加 EventListener 而不将 weakReference 设置为 true - 那么一切都应该没问题...

    【讨论】:

    • 我不认为添加另一个单例对我来说是一个合适的解决方案。截至目前,我已将计时器添加到调解器并发送通知以调用命令。无论如何,我不认为哪个是正确的解决方案,但是我必须对此进行管理。将计时器添加到代理是一个很好的解决方法。谢谢!!!
    • 如果这个答案对你有帮助,请接受它为正确的。谢谢
    【解决方案3】:

    试试这个:

    • 创建一个单例类 - singleton class in Flex
    • 在此类中有一个函数(例如,称为 start),当被调用时会启动一个计时器,其回调函数会发送一个通知,触发执行您的业务逻辑的命令。
    • 当您准备好开始常规操作时,只需在单例上调用 get 实例方法,以创建单例,然后调用它的 start() 函数。 *可选有一个停止功能,取消计时器并停止发送常规通知。

      package
      {
       import flash.events.TimerEvent;
       import flash.utils.Timer;
      
      
       public final class RepititiveSingleton
       {
          private var timer:Timer;
      
          private static var instance:RepititiveSingleton= new RepititiveSingleton();
      
          public function RepititiveSingleton() {
              if( RepititiveSingleton.instance ) {
                  throw new Error( 
                      "ReptitiveSingleton can only be accessed through Singleton.getInstance()" ); 
              }
          }
      
          public static function getInstance():RepititiveSingleton{                        
              return RepititiveSingleton.instance;
          }
      
          public function start(interval:Number = 1000):void {
              timer = new Timer(interval);
              timer.addEventListener(TimerEvent.TIMER, onTimer);
          }
      
          private function onTimer(e:TimerEvent):void {
                       ApplicationFacade.getInstance().sendNotification(Constants.REPTITIVE_ACTION_NOTIFICATION));
          }
      
       }
      }
      

    此代码假定您拥有名为 ApplicationFacade 的 Concrete 外观,并已使用从名为 constants 的类引用的 String 常量注册了一个通知。

    然后在适当的地方(可能在你的启动命令中)你可以添加:

    RepetitiveSingleton.getInstance().start();
    

    希望对你有所帮助。

    【讨论】:

      【解决方案4】:

      IMO,计时器属于中介。让它 - 好吧,调解异步进程消息传递。这将是一个小型状态机,以确保一切顺利运行。命令仍然是繁重的工作,它只是像 911 接线员一样坐在那里。

      【讨论】:

        猜你喜欢
        • 2011-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-07
        • 1970-01-01
        • 2013-09-30
        • 1970-01-01
        • 2016-09-01
        相关资源
        最近更新 更多