Как выполнять повторяющиеся действия в приложении PureMVC flex?

В настоящее время работает над проектом flex AIR, основанным на платформе PureMVC. К проекту появилось новое требование: операция должна выполняться периодически с регулярным интервалом, что имеет определенную бизнес-логику. Согласно PureMVC это должно быть помещено в команду, но тогда команда получит сборщик мусора в момент ее выполнения.

Учитывая сценарий, есть немного сомнений / путаницы / разъяснений...

  1. Создание команды с бизнес-логикой было бы одним из решений... но тогда кто будет запускать ее через определенный промежуток времени? (не должно ли это быть сделано командой согласно PureMVC)
  2. Размещение триггера команды в посреднике или размещение логики в посреднике (это сделает pureMVC немного нечистым:))

Как мне найти решение для такого сценария?

4 ответа

Решение

Вам необходимо разделить асинхронный процесс, который вы хотите запустить, и повторный запуск указанного процесса. Мой совет - создать прокси для асинхронного процесса и отдельный прокси, который является оберткой для таймера, который просто отправляет уведомление по истечении времени ожидания. Уведомление связано с командой, которая, в свою очередь, вызывает методы асинхронного прокси. Таким образом, вы можете добавить логику в команду, например, что делать, если процесс все еще занят.

Преимущества создания двух прокси: вы придерживаетесь SRP. Вы можете легко поменять / изменить / удалить прокси синхронизации без касания асинхронного прокси. Все красиво отделено.

Зависит от того, что Command следует сделать - если он обновляет Model положить Timer в одном из ваших Proxy класс и отправить Notification каждые хх секунд, которые отображаются на Command что делает то, что вы хотите, чтобы это было.

Если это должно просто обновить View Вы могли бы добавить Timer к соответствующему Mediator но тогда вам не понадобится Command совсем.

**

Не создавайте больше синглетонов, чем вам нужно. ApplicationFacade уже один - попробуйте и держите это так.

**

Если вам нужно выполнить какие-либо асинхронные вызовы с бэкэндом, просто добавьте EventListener без weakReference установите в true - тогда все должно быть в порядке...

Попробуй это:

  • Создать класс Singleton - класс Singleton во Flex
  • Имейте функцию в этом классе (например, вызываемый запуск), который при вызове запускает таймер, функция обратного вызова которого отправляет уведомление, которое запускает команду, которая выполняет вашу бизнес-логику.
  • Когда вы будете готовы начать свои обычные действия, просто вызовите метод 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, и вы зарегистрировали уведомление, используя константу String, на которую ссылается класс, называемый константами.

Затем в соответствующем месте (возможно, в вашей команде запуска) вы можете добавить:

RepetitiveSingleton.getInstance().start();

Надеюсь, это поможет вам.

ИМО, таймер принадлежит посреднику. Пусть это, ну, посредник процесса обмена сообщениями. Это будет небольшой конечный автомат, чтобы убедиться, что все работает гладко. Команды все еще выполняют тяжелую работу, они просто сидят как оператор 911.

Другие вопросы по тегам