Как выполнять повторяющиеся действия в приложении PureMVC flex? - PullRequest
1 голос
/ 25 января 2012

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

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

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

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

Ответы [ 4 ]

1 голос
/ 25 января 2012

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

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

**

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

**

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

1 голос
/ 27 января 2012

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

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

0 голосов
/ 30 января 2012

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

0 голосов
/ 25 января 2012

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

  • Создание класса 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();

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

...