0

同時に実行されている 2 つの 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: 実行中の 2 つの SWF 間の通信に LocalConnection を使用できることはわかっていますが、何らかの制限がある場合は SO について知りたいと思っています。

アップデート:

コンパイルされた Flex アプリをディスクから 2 回実行し、2 回目のテキストフィールドに「swf2」を入力します。両方でスタートを押します。最初に開始されたものは、2 番目のものが接続されたことを決して検出しません。

<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>
4

2 に答える 2

0

ファイルの読み取りを強制する必要がありますが、クライアントが既に持っているデータの読み取りは強制する必要はありません:/

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
}
于 2012-06-18T07:25:29.113 に答える
0

ふぅ、答えが見つかりました。Jevgeenij は、共有オブジェクトの再読み取りを強制する方法を教えてくれましたが、彼のコードは正確には機能しませんでした。追加する必要があったのはこれです。

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 インスタンスから書き込まれた値が取得されます。

于 2012-06-19T02:48:44.773 に答える