目前正在开发一个基于 PureMVC 框架的 flex AIR 项目。项目有一个新的需求,一个操作要定期重复执行,有一定的业务逻辑。根据 PureMVC,这应该放在命令中,但是命令会在执行时被垃圾收集。
鉴于这种情况,几乎没有疑问/困惑/澄清......
- 使用业务逻辑创建命令将是一种解决方案……但是谁会在特定时间间隔触发它?(这不应该通过 PureMVC 的命令来完成)
- 将命令触发器放在中介器中或将逻辑放在中介器中(这会使 pureMVC 有点不纯:))
如何为这种情况找到解决方案?
目前正在开发一个基于 PureMVC 框架的 flex AIR 项目。项目有一个新的需求,一个操作要定期重复执行,有一定的业务逻辑。根据 PureMVC,这应该放在命令中,但是命令会在执行时被垃圾收集。
鉴于这种情况,几乎没有疑问/困惑/澄清......
如何为这种情况找到解决方案?
取决于Command
应该做什么——如果它更新你的一个类中的Model
put a并每隔 xx 秒发送一个映射到 a 的 a ,它可以做你想做的任何事情。Timer
Proxy
Notification
Command
如果它应该只是更新View
你可以添加Timer
到相应的Mediator
但你根本不需要 a Command
。
**
不要创建比您需要的更多的单例。ApplicationFacade
已经是一个-尝试保持这种状态。
**
如果您必须对后端进行任何异步调用,只需确保将EventListener
withoutweakReference
设置为 true - 那么一切都应该没问题...
您需要将要运行的异步进程和所述进程的重复触发分开。我的建议是为异步进程创建一个代理和一个单独的代理,它是一个定时器的包装器,它只是在超时时发送通知。通知耦合到一个命令,该命令又调用异步代理的方法。这样,您可以向命令添加逻辑,例如如果进程仍然很忙,该怎么办。
创建两个代理的好处:您遵守 SRP。您可以在不接触异步代理的情况下轻松交换/修改/删除计时代理。一切都很好地分开。
试试这个:
当您准备好开始常规操作时,只需在单例上调用 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();
希望这对您有所帮助。
IMO,计时器属于调解员。让它——好吧,调解异步进程消息传递。这将是一个小型状态机,以确保一切顺利运行。命令仍然是繁重的工作,它只是像 911 接线员一样坐在那里。