AS3: класс Singleton против класса LocalConnection - PullRequest
0 голосов
/ 15 августа 2010

У меня есть основной класс, загружающий 2 SWF (загрузчик и программа просмотра, также с классами документов).Они должны совместно использовать двойной буфер с содержимым, конечно, заполненным загрузчиком и показанным средством просмотра

Я думал об использовании класса LocalConnection, но после предложения от PatrickS теперь я оцениваю возможность SingletonУчебный класс.Я никогда не использовал этот шаблон в AS и должен признаться, что я довольно предвзят.Но в этом конкретном случае, я думаю, это будет полезно.Кстати, немного удивился, прочитав в блоге gskinner 2 реализации примеров.Итак, я очень ценю ваши взгляды, зная, что эта тема - бесконечная война, как Mac против ПК, один

Примите во внимание: 1. Настольное приложение AIR, работающее 24x7 в течение нескольких месяцев на высокопроизводительном ПК с Windows,Взаимодействие с пользователем не требуется 2. Высокопроизводительный код является обязательным, поскольку загружаемый контент представляет собой изображения Full HD

Другая моя проблема связана с утечками памяти

Заранее спасибо

1 Ответ

1 голос
/ 15 августа 2010

Лично я бы избегал Синглтона, так как он регулярно применяется.Однако иметь единственный экземпляр этого объекта буфера имеет смысл.Так что я бы сделал в этом случае, чтобы ваш класс Main создал этот объект.Когда зритель загружен, передайте ему этот объект.Затем сделайте то же самое для загрузчика.Теперь оба ваших swfs имеют общий объект, который они могут использовать для общения.Затем вы можете вызывать функции и заставлять его отправлять события, если хотите (расширяя EventDispatcher или реализуя IEventDispatcher).Или вы можете просто зарегистрировать обратные вызовы, если хотите (должно быть немного быстрее, но не уверены, что это будет иметь большое значение).

Редактировать

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

PhotoLoader.swf:

package  {
import flash.display.Sprite;
import flash.events.Event;

public class PhotoLoader extends Sprite {

    private var _commonObject:CommonObject;

    public function PhotoLoader() {

    }

    public function setCommonObject(commonObject:CommonObject):void {
        trace("PhotoLoader::setCommonObject", commonObject);
        _commonObject = commonObject;
        _commonObject.addEventListener(Event.INIT,handleInit);
    }

    private function handleInit(e:Event):void {
        trace("PhotoLoader::handleInit");
    }

}

} 

PhotoViewer.swf:

package  {
    import flash.display.Sprite;
    import flash.events.Event;

    public class PhotoViewer extends Sprite {

        private var _commonObject:CommonObject;

        public function PhotoViewer() {

        }

        public function setCommonObject(commonObject:CommonObject):void {
            trace("PhotoLoader::setCommonObject", commonObject);
            _commonObject = commonObject;
            _commonObject.addEventListener(Event.INIT,handleInit);
        }

        private function handleInit(e:Event):void {
            trace("PhotoViewer::handleInit");
        }

    }

}

Main.swf

package {
    import flash.display.Loader;
    import flash.display.LoaderInfo;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.net.URLRequest;
    import flash.system.ApplicationDomain;
    import flash.system.LoaderContext;

    public class Main extends Sprite {

        private var _photoLoader:PhotoLoader;
        private var _photoViewer:PhotoViewer;
        private var _commonObject:CommonObject;

        private var _viewerLoader:Loader;
        private var _loaderLoader:Loader;

        private var _count:int = 0;

        public function Main():void {
            _commonObject = new CommonObject();
            loadSwfs();

        }

        private function loadSwfs():void {

            _viewerLoader = new Loader();
            _viewerLoader.contentLoaderInfo.addEventListener(Event.INIT,handleInit);
            _viewerLoader.load(new URLRequest("PhotoViewer.swf"));

            _loaderLoader = new Loader();
            _loaderLoader.contentLoaderInfo.addEventListener(Event.INIT,handleInit);
            _loaderLoader.load(new URLRequest("PhotoLoader.swf"));

        }

        private function handleInit(e:Event):void {
            trace("handleInit");
            var loader:Loader = (e.target as LoaderInfo).loader;
            switch(loader) {
                case _viewerLoader:
                    _photoViewer = _viewerLoader.content as PhotoViewer; 
                    _photoViewer.setCommonObject(_commonObject);
                    _count++;
                    break;
                case _loaderLoader:
                    _photoLoader = _loaderLoader.content as PhotoLoader; 
                    _photoLoader.setCommonObject(_commonObject);
                    _count++;
                    break;
            }
            if(_count == 2) { 
                _commonObject.init();
            }

        }


    }

}

И общий объект, общий для 3 swf:

package  {
    import flash.events.Event;
    import flash.events.EventDispatcher;

    public class CommonObject extends EventDispatcher {

        public function CommonObject() {

        }

        public function init():void {
            dispatchEvent(new Event(Event.INIT));
        }
    }

}

В основном, когда вы загружаете и свои SWF-файлы для просмотра и загрузки, вы передаете экземпляр этого общего объекта.Затем вы регистрируетесь для прослушивания метода INIT: это скажет загрузчику и зрителю, что все настроено.Таким образом, в этот момент вы можете начать отправку сообщений от вашего зрителя или загрузчика другой стороне (вы можете реализовать это посредством диспетчеризации событий);в основном, создайте метод в общем объекте, чтобы сделать это за вас, или просто вызовите dispatchEvent для общего объекта напрямую.

...