目前正在开发基于PureMVC框架的flex AIR项目。对项目有一个新的要求,一个操作将定期重复执行,具有一些业务逻辑。根据PureMVC,这应该放在命令中,但是命令会在执行时收集垃圾。
鉴于这种情况,很少有疑惑/混淆/澄清......
如何为这种情况找到解决方案?
答案 0 :(得分:1)
取决于Command
应该做什么 - 如果它更新Model
将Timer
放入您的Proxy
课程中,并每次发送Notification
映射到Command
的xx秒,它可以执行您希望它执行的操作。
如果只是更新View
,您可以将Timer
添加到相应的Mediator
,但之后您根本不需要Command
。< / p>
**
不要创造比你需要更多的单身人士。 ApplicationFacade
已经是一个 - 试着保持这种状态。
**
如果你必须对后端进行任何异步调用,只需确保将EventListener
添加weakReference
设置为true - 那么一切都应该没问题......
答案 1 :(得分:1)
您需要拆分要运行的异步进程以及重复触发所述进程。我的建议是为异步进程创建一个代理服务器和一个单独的代理服务器,它是一个Timer的包装器,它只是在超时时发送通知。通知与命令相关联,而命令又调用异步代理的方法。这样,您就可以为命令添加逻辑,例如,如果进程仍然忙,该怎么做。
创建两个代理的好处:您遵守SRP。无需触摸异步代理即可轻松交换/修改/删除定时代理。一切都很好分开。
答案 2 :(得分:-1)
试试这个:
当您准备好开始常规操作时,只需在您的单例上调用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();
希望这会对你有所帮助。
答案 3 :(得分:-1)
IMO,计时器属于调解员。让它 - 好吧,调解异步流程消息。这将是一个小型状态机,以确保一切运行顺利。命令仍然繁重,它只是像911操作员一样坐着。