AS3:共享对象问题
我一直在思考的一个小问题,我有一个从网址加载文本的类作为同步时间的方法。AS3:共享对象问题
swf文件可以在同一页面多次,但我希望它检查是否有一个瑞士法郎同步,如果是的话,等待它完成并加载其sync'd值(而不是查询url本身),以便它们都被同步到相同的值(要加载的第一个swf文件)。
我想这个使用共享对象,这看起来有点像这样(摘录):
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);
}
}
}
我得到的问题是,第一SWF创建sharedobject很好,但第二个将endTime作为undefined读取,除非我刷新页面(即它不接收实时更改)。这种方法不可行吗,我应该再试一次吗?
在此先感谢。
编辑:决定将另一个栈来解释多一点:(as3) Sync data between 3 or more identical flash objects on the same page
你可以调用javascript函数做锁定,如果你坚持这个解决方案
好了,可以使用localConnection
通常,您不应该使用本地SharedObjects来同步事物。 flush()命令从来没有以你想要的方式工作。
我会放弃它,谢谢。 – Andy 2010-01-18 07:54:19
本地连接也没有太好的工作,有更多的一个开放的连接有一些问题:( – Andy 2010-02-01 10:41:06
如果你有这个问题,你需要管理多个打开的连接与生成的ID根据时间戳记(粒度足够小,所以你可以考虑加载时间),或者实现某种跟踪系统..例如,用给定组中多少个swf的长度来管理一个数组......每当一部电影出现时就增加数组的相应部分它的类型被加载,只有类似索引实例能够相互通信;或者,为页面上的每部电影生成一个flashvar跟踪ID,只有具有相同ID的swf才能通话 – michael 2010-02-01 19:27:16
没有我想尝试的东西,想保持在Flash文件中的控制,没有任何其他的外部interation。 – Andy 2010-01-14 12:11:27