سؤال

لدي فئة رئيسية تحميل 2 SWF (Loader and Viewer ، أيضًا مع فئات المستندات). إنهم بحاجة إلى مشاركة مخزن مؤقت مزدوج مع المحتوى ، بالطبع ، يملأه اللودر وأظهره المشاهد

كنت أفكر في استخدام فئة LocalConnection ، لكن بعد اقتراح من Patricks الآن أقوم بتقييم إمكانية وجود فصل مفردة. لم أستخدم هذا النمط أبدًا ويجب أن أعترف أنني متحيز إلى حد ما. لكن في هذه الحالة بالذات ، أعتقد أنه سيكون مفيدًا. بالمناسبة ، فاجأت القراءة قليلاً في أمثلة تطبيقات GSKINNER Blog 2. لذا ، سأقدر حقًا وجهات نظركم ، مع العلم أن هذا الموضوع هو حرب لا نهاية لها مثل Mac vs PC One

خذ في الاعتبار: 1. تطبيق سطح المكتب الجوي يعمل 24 × 7 خلال بضعة أشهر في جهاز كمبيوتر يعمل بنظام Windows. لا يوجد تفاعل للمستخدم 2. رمز الأداء العالي أمر لا بد منه لأن المحتوى المحمل هو صور عالية الدقة

قلقي الآخر هو حول تسرب الذاكرة

شكرا مقدما

هل كانت مفيدة؟

المحلول

كنت أتجنب المفرد ، شخصيا ، كما تم تنفيذه بانتظام. ومع ذلك ، فإن وجود مثيل واحد من هذا الكائن العازلة أمر منطقي. لذا فإن ما سأفعله في هذه الحالة هو أن إنشاء الفصل الرئيسي الخاص بك هذا الكائن. عندما يتم تحميل المشاهد ، مرره هذا الكائن. ثم افعل الشيء نفسه للودر. الآن ، يشترك كل من SWFs في كائن مشترك يمكنهم استخدامه للتواصل. بعد ذلك ، يمكنك الاتصال بالوظائف عليها وجعلها ترسل الأحداث إذا كنت تريد (تمديد EventDispatcher أو تنفيذ IeventDispatcher). أو يمكنك فقط تسجيل عمليات الاسترجاعات إذا كنت تريد (يجب أن تكون أسرع قليلاً ، ولكن لست متأكدًا مما إذا كان سيحدث فرقًا كبيرًا).

يحرر

إلقاء نظرة على سؤالك الآخر ، أعتقد أن مشكلتك كانت مرتبطة بالحصول على المحمل الصحيح ونقل البيانات إلى المحتوى المحمّل. إليك Skecth كيف يمكنك تنفيذ ما ذكرته أعلاه.

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();
            }

        }


    }

}

والكائن المشترك ، الذي يشاركه SWF 3:

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));
        }
    }

}

في الأساس عند تحميل كل من SWFs المشاهد والمواد المحمولة ، يمكنك تمرير مثيل لهذا الكائن المشترك. ثم تقوم بالتسجيل للاستماع إلى طريقة init: سيخبر هذا المحمل والمشاهد أن كل شيء قد تم إعداده. لذلك في هذه المرحلة ، يمكنك البدء في إرسال رسائل من المشاهد أو المحمل إلى الطرف الآخر (يمكنك تنفيذ هذا من خلال إرسال الحدث) ؛ قم بعمل طريقة في الكائن المشترك بشكل أساسي للقيام بذلك نيابة عنك أو مجرد استدعاء الإرسال على الكائن المشترك مباشرة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top