Вспышка локального общего объекта, не обнаруживающего изменений, внесенных другими SWF-файлами

Я использую локальный общий объект как средство для передачи данных между двумя запущенными SWF одновременно.

so = getLocal("mySO");

// set the value from a user input, and set it to 'connected'
so.setProperty(txtName.text, "connected")

// every few seconds check if the other SWF started and modified value
onTimer 
{
 var data:Object = so.data
// breakpoint and inspect the data with debugger
}

Последняя прокомментированная строка - это проблема. В отладчике никаких изменений данных не обнаруживается, но при проверке файла .sol с помощью .minerva я вижу изменения в обоих SWF-файлах. Таким образом, хотя общий объект изменен SWF 2, SWF 1 не видит этих изменений. Это как должно быть?

ps: Я знаю, что могу использовать LocalConnection для связи между двумя запущенными SWF, но все же хочу знать о SO, если есть какие-то ограничения.

ОБНОВИТЬ:

Дважды запустите скомпилированное приложение Flex с диска, поместите swf2 в текстовое поле второго. Нажмите "Пуск" на обоих. Первый, который запущен, никогда не обнаруживает, что второй был подключен.

<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" 
               minWidth="955" 
               minHeight="600"
               creationComplete="application1_creationCompleteHandler(event)"
               >

    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;

            private var timer:Timer;
            private var so:SharedObject;

            protected function application1_creationCompleteHandler(event:FlexEvent):void
            {
                so = SharedObject.getLocal("mySO");

                timer = new Timer(1000);
                timer.addEventListener(TimerEvent.TIMER, onTimer);

            }

            protected function button1_clickHandler(event:MouseEvent):void
            {
                so.setProperty(txtSwf.text, 'connected');
                so.flush();
                timer.start();

            }


            protected function onTimer(event:TimerEvent):void
            {
                so = SharedObject.getLocal("mySO");
                txtLog.text += so.data["swf1"] + "\n";
                txtLog.text += so.data["swf2"] + "\n";
                txtLog.text += "------------ \n";

            }

        ]]>
    </fx:Script>

    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <s:TextInput id="txtSwf" x="10" y="50" text="swf1"/>
    <s:Button x="170" y="50" label="Start" click="button1_clickHandler(event)"/>
    <s:TextArea id="txtLog" x="10" y="154" width="279" height="112" />


</s:Application>

person Ska    schedule 17.06.2012    source источник
comment
LocalConnection - лучший вариант для вас. Помимо этого, находятся ли файлы SWF в одном домене?   -  person The_asMan    schedule 18.06.2012
comment
SWF запускаются из IDE, а один - с диска с FP, без браузера. Они оба пишут ТАК, я это проверил. Однако они не замечают изменений, внесенных другими. Как я уже сказал, LC - еще один вариант, но я все же хотел бы узнать о SO, почему он так себя ведет.   -  person Ska    schedule 18.06.2012
comment
Я считаю, что запуск одного с диска и одного из IDE - это не один и тот же домен. Вы должны запускать их все с диска или все из браузера. Попробуйте опубликовать все в Интернете и посмотрите, получите ли вы желаемый результат.   -  person The_asMan    schedule 18.06.2012
comment
@The_asMan Я тоже пробовал запускать оба с диска.   -  person Ska    schedule 18.06.2012
comment
Хорошо попробуйте запустить оба в браузере в одном домене. Под браузером я подразумеваю сервер, у которого есть домен или, по крайней мере, IP-адрес. Я не говорю о запуске браузера с жесткого диска. Также опубликуйте свой код для встраивания.   -  person The_asMan    schedule 19.06.2012
comment
Нет, не работает, я запускал их с локального хоста. Опять же, проверка SO показывает, что они оба пишут ему. Просто они не обнаруживают изменений, внесенных другим SWF-файлом во время выполнения. Они действительно принимают изменения, если SWF запускается снова.   -  person Ska    schedule 19.06.2012
comment
Думаю, я нашел свое решение, проверьте свой ответ.   -  person Ska    schedule 19.06.2012


Ответы (2)


Вам нужно принудительно прочитать файл, но не данные, которые у клиента уже есть: /

so = getLocal("mySO");

// set the value from a user input, and set it to 'connected'
so.setProperty(txtName.text, "connected")

// every few seconds check if the other SWF started and modified value
onTimer 
{
    so = getLocal("mySO"); // read the so file.

    var data:Object = so.data
}
person Jevgenij Dmitrijev    schedule 18.06.2012

Уф, нашел ответ. Евгений дал мне указание принудительно перечитать общий объект, но его код не работал точно. мне нужно было добавить вот это.

so = getLocal("mySO");

// set the value from a user input, and set it to 'connected'
so.setProperty(txtName.text, "connected")

// every few seconds check if the other SWF started and modified value
onTimer 
{
    so = getLocal("mySO"); // read the so file.

    var data:Object = so.data;

    so = null // MAKE IT NULL AND HOPE IT'S GC'D BEFORE NEXT TIMER
}

Уловка заключалась в том, чтобы установить для него значение null после использования, только после этого он принудительно перечитывается и значения записываются из другого экземпляра SWF.

person Ska    schedule 19.06.2012