1

現在、PureMVC フレームワークに基づくフレックス AIR プロジェクトに取り組んでいます。プロジェクトには新しい要件がありました。操作は、一定の間隔で繰り返し実行され、何らかのビジネス ロジックがあります。PureMVC に従って、これはコマンドに配置する必要がありますが、コマンドが実行された瞬間にガベージ コレクションが実行されます。

シナリオを考えると、疑問/混乱/説明はほとんどありません...

  1. ビジネス ロジックを使用してコマンドを作成することは 1 つの解決策ですが、特定の間隔でコマンドをトリガーするのは誰でしょうか? (これは PureMVC に従ってコマンドで行うべきではありません)
  2. コマンドトリガーをメディエーターに配置するか、ロジックをメディエーターに配置します(これにより、pureMVCが少し不純になります:))

この種のシナリオの解決策を見つけるにはどうすればよいですか?

4

4 に答える 4

1

何をCommandすべきかによって異なります-それがあなたのクラスの1つにputaを更新し、xx秒ごとに送信するModel場合、それはあなたがやりたいことを何でもするにマップされます。TimerProxyNotificationCommand

更新する必要がある場合は、対応するにをView追加できますが、その場合はまったく必要ありません。TimerMediatorCommand

**

必要以上のシングルトンを作成しないでください。ApplicationFacadeすでに1つです-そのようにしてください。

**

バックエンドに対して非同期呼び出しを行う必要がある場合は、必ずtrueに設定EventListenerせずに追加しweakReferenceてください。そうすれば、すべて問題ないはずです...

于 2012-01-25T17:17:38.880 に答える
1

実行する非同期プロセスと、そのプロセスの繰り返しトリガーを引き離す必要があります。私のアドバイスは、非同期プロセス用のプロキシと、タイムアウト時に単に通知を送信するタイマーのラッパーである別のプロキシを作成することです。通知はコマンドに結合され、コマンドは非同期プロキシのメソッドを呼び出します。そうすれば、プロセスがまだビジーな場合にどうするかなど、コマンドにロジックを追加できます。

2 つのプロキシを作成する利点: SRP に準拠します。非同期プロキシに触れることなく、タイミング プロキシを簡単に交換/変更/削除できます。すべてがうまく分離されています。

于 2012-01-27T11:05:26.647 に答える
-1

IMO、タイマーはメディエーターに属します。まあ、非同期プロセスのメッセージングを仲介します。すべてがスムーズに実行されていることを確認するための小さなステート マシンになります。コマンドは依然として重荷を担い、911 のオペレーターのように座っているだけです。

于 2012-01-30T04:30:59.867 に答える
-1

これを試して:

  • シングルトン クラスを作成する - Flex のシングルトン クラス
  • このクラスには、呼び出し時にタイマーを開始する関数 (たとえば、start と呼ばれる) があり、そのコールバック関数は通知を送信し、ビジネス ロジックを実行するコマンドをトリガーします。
  • 通常のアクションを開始する準備ができたら、シングルトンで get instance メソッドを呼び出してシングルトンを作成し、その 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 に答える