RemoteのSharedObjectをつかって情報のやりとりを実行しようとしたところ、うまくいきませんでした。
結論からいうと、以下の2点です。
- 配列を保持すると、部分が抜け落ちることがある。(Red5とAMF3とのやりとり上の動作)
- SharedObjectをNetConnectionに接続した直後にPropertyを設置しようとすると、データが破壊され、以後データがあつかえなくなる。
上記の方は、接続をすべて、AMF0に変更して動作させれば問題ないです。
原因は推測ですが
1:すべてのメッセージがきちんと同期していない。(AMF3になって非同期操作が若干はいった?)
2:ポインタ参照ですむ部分は参照情報のみ送信する形ですませてしまっており、受け取り側で情報参照がうまくできていない?
かと思っています。
下記の方は、以下のテストをしてみましたところ確かにそうなりました。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" minWidth="955" minHeight="600" initialize="init()">
<mx:Script>
<![CDATA[
private var _nc:NetConnection;
private var _so:SharedObject;
private var _so2:SharedObject;
private function init():void {
_nc = new NetConnection;
_nc.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
_nc.connect("rtmp://localhost:11935/ttProject");
// この部分で_soにプロパティーを設置するのはNG
}
private function loginfo(str:String):void {
ExternalInterface.call("console.log", str);
}
private function netStatusHandler(event:NetStatusEvent):void {
loginfo(event.info.code);
if(event.info.code == "NetConnection.Connect.Success") {
_so = SharedObject.getRemote("comment", _nc.uri);
_so.addEventListener(SyncEvent.SYNC, soSyncHandler);
_so.connect(_nc);
_so2 = SharedObject.getRemote("userData", _nc.uri);
_so2.addEventListener(SyncEvent.SYNC, soSyncHandler2);
_so2.connect(_nc);
// この部分で_soにプロパティーを設置するのはNG
}
}
private function soSyncHandler(event:SyncEvent):void {
loginfo(""+event.changeList.length);
var count:int = event.changeList.length;
for(var key:Object in event.changeList) {
loginfo("" + key);
for(var key2:Object in event.changeList[key]) {
loginfo(" " + key2 + ":" + event.changeList[key][key2]);
}
}
// この部分で_soにプロパティーを設置するのは問題なし。(ただし無限ループに注意)
}
private function soSyncHandler2(event:SyncEvent):void {
loginfo(""+event.changeList.length);
var count:int = event.changeList.length;
for(var key:Object in event.changeList) {
loginfo("" + key);
for(var key2:Object in event.changeList[key]) {
loginfo(" " + key2 + ":" + event.changeList[key][key2]);
}
}
}
private function test():void {
_so.setProperty("hogehoge", "aiueo5");
_so2.setProperty("hogehoge2", "aiueo6");
// この部分で_soにプロパティーを設置するのは問題なし。
}
]]>
</mx:Script>
<mx:Button click="test()" />
</mx:Application>
上記の用に、SharedObjectの接続が完了したことを明示してから、setPropertyを利用しないとSharedObjectの動作そのものが不可能になります。
最終更新:2011年01月05日 12:04