1

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

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

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

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

4

4 回答 4

1

取决于Command应该做什么——如果它更新你的一个类中的Modelput a并每隔 xx 秒发送一个映射到 a 的 a ,它可以做你想做的任何事情。TimerProxyNotificationCommand

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

**

不要创建比您需要的更多的单例。ApplicationFacade已经是一个-尝试保持这种状态。

**

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

于 2012-01-25T17:17:38.880 回答
1

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

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

于 2012-01-27T11:05:26.647 回答
-1

试试这个:

  • 创建一个单例类 - 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();

希望这对您有所帮助。

于 2012-01-25T14:48:19.420 回答
-1

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

于 2012-01-30T04:30:59.867 回答