AS3: проблема с общими объектами - PullRequest
0 голосов
/ 14 января 2010

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

SWF-файл может находиться на одной странице несколько раз, но я хочу, чтобы он проверил, синхронизируется ли один из SWF-файлов, если это так, то дождитесь его завершения и загрузите его значение синхронизации (скорее затем запросите сам URL), чтобы все они синхронизировались с одним и тем же значением (1-го SWF-файла для загрузки).

Я пытаюсь сделать это, используя Shared Objects, который выглядит примерно так (фрагменты):

public function sync():void
    {
        sharedObject = SharedObject.getLocal("synctime", "/");
        trace(sharedObject.data.startOfRequest, sharedObject.data.endTime);
        if ( ((new Date().getTime() - 10000) < sharedObject.data.startOfRequest) && (sharedObject.data.endTime !== undefined))
        {
            loadUTCFromSharedObject();
        } 
        else if ( ((new Date().getTime() - 10000) < sharedObject.data.startOfRequest) && (sharedObject.data.endTime == undefined ) )
        {
            timer.addEventListener(TimerEvent.TIMER, loadUTCFromSharedObject);
            timer.addEventListener(TimerEvent.TIMER_COMPLETE, startSync);
            timer.start();
        } else {
            startSync()
        }
    }

    private function startSync(e:Event = null) 
    {
        var syncRequest:URLRequest = new URLRequest(TIMEURL + "?cb=" + Math.random());
        var syncTimeLoader:URLLoader = new URLLoader();

        syncTimeLoader.dataFormat = URLLoaderDataFormat.TEXT;
        syncTimeLoader.addEventListener(Event.COMPLETE, syncTimeComplete );
        syncTimeLoader.addEventListener(IOErrorEvent.IO_ERROR, syncTimeFailed );

        sharedObject.clear();
        startOfRequest = new Date();
        sharedObject.data.startOfRequest = startOfRequest.getTime();
        sharedObject.flush();
        syncTimeLoader.load(syncRequest);
    }
    private function loadUTCFromSharedObject(e:Event = null):void
    {
        var sharedObjectCheck:SharedObject = SharedObject.getLocal("synctime", "/");

        trace (sharedObject.data.endTime, sharedObjectCheck.data.endTime);
        if ( sharedObject.data.endTime !== undefined )
        {
            timer.removeEventListener(TimerEvent.TIMER, loadUTCFromSharedObject);
            timer.removeEventListener(TimerEvent.TIMER_COMPLETE, startSync);
            dispatchEvent( new LoadUTCTimeEvent(LoadUTCTimeEvent.SYNC_COMPLETE, null, null, sharedObject, true));   
            trace(sharedObject.data.UTCOffset);
        }
    }
    private function syncTimeComplete(event:Event):void 
    {           
        var loadedText:URLLoader = URLLoader(event.target);
        dispatchEvent( new LoadUTCTimeEvent(LoadUTCTimeEvent.SYNC_COMPLETE, loadedText.data, startOfRequest, sharedObject, false));

    }

Диспетчер событий:

public function LoadUTCTimeEvent(eventStatus:String, timeString:String = null, startOfRequest:Date = null, sharedObject:SharedObject = null, loadFromSharedObject:Boolean = false):void
    {
        super(eventStatus);
        if (eventStatus == SYNC_COMPLETE) {
            if (loadFromSharedObject == true) {
                time = sharedObject.data.syncTime;
                UTCOffset = sharedObject.data.UTCOffset;
            } 
            else
            {
                //...snip....//
                sharedObject.data.UTCOffset = UTCOffset;
                sharedObject.data.syncTime = time;
                sharedObject.data.endTime = curDate.getTime();
                sharedObject.flush(1000);
            }

        }
    }

Проблема, которую я получаю, заключается в том, что 1-й swf создает штраф для общего объекта, но второй читает endTime как неопределенный, если я не обновляю страницу (т.е. он не принимает живые изменения). Разве этот метод не возможен, я должен попробовать другой подход?

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

Редактировать: решил добавить еще один стек, чтобы объяснить немного подробнее: (as3) Синхронизировать данные между 3 или более одинаковыми флэш-объектами на одной странице

Ответы [ 2 ]

0 голосов
/ 15 января 2010

Хорошо, используйте локальное соединение

Как правило, вы не должны использовать Local SharedObjects для синхронизации вещей. Команда flush () никогда не работала для меня так, как вы намеревались.

0 голосов
/ 14 января 2010

вы можете вызвать функцию javascript для блокировки, если вы застряли с этим решением

...