2012-06-17 81 views
0

我正在使用本地共享對象作爲在兩個swf同時運行之間傳輸數據的手段。Flash本地共享對象沒有檢測到其他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 
} 

最後一條註釋行是問題所在。在調試器中,沒有檢測到對數據的更改,但是使用.minerva檢查.sol文件時,我看到了兩個SWF的更改。因此,雖然共享對象被SWF 2修改,但SWF 1並未看到這些更改。這是怎麼回事?

ps:我知道我可以使用LocalConnection在兩個正在運行的SWF之間進行通信,但如果存在某種限制,仍然想知道SO。

UPDATE:

運行磁盤中的編譯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> 
+1

LocalConnection對你來說是更好的途徑。除此之外,SWF在同一個域中? –

+0

SWF從IDE運行,一個從帶有FP的磁盤運行,沒有瀏覽器。他們都寫信給SO,我證實了這一點。他們沒有發現別人已經做出的改變。正如我所說,LC是另一種選擇,但我仍然想了解SO爲什麼它的行爲如此。 – Ska

+0

我相信從磁盤運行一個和來自IDE的運行不是同一個域。您必須全部從磁盤或全部從瀏覽器運行它們。嘗試將所有內容發佈到網絡上,然後查看您是否以這種方式獲得了結果。 –

回答

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 
} 

訣竅是將其設置使用後空,纔對其進行強制重新讀取並從其他SWF實例寫入的值回升。

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 
} 
+0

不起作用,請檢查帖子中的更新。 – Ska

+0

有趣.... –

相關問題