我无法实现此功能。基本上,我有许多需要使用URLoader加载的大块数据。我想使用延迟加载,因为急切加载占用了大量的网络资源/时间。例如:
class Foo {
private var _resources:Array;
public get_resource(id:String){
if ( _resources[id] == null ){
//Load the resource
}
return _resources[id];
}
}
但是,上述代码仅适用于同步加载。我不希望异步暴露给程序的其他部分。我该怎么做呢?感谢。
答案 0 :(得分:3)
由于异步函数立即返回(在加载完成之前), 你需要传递一个回调函数(事件处理程序)来从中获取数据。
代码可能是这样的:
class Foo {
private var _resources:Array;
private var _loader:Array; // holds URLLoader objects
public get_resource(id:String, callback:Function) : void {
if ( _loader[id] == null ){
var ld : URLLoader = new URLLoader();
// instead of returning value, callback function will be
// called with retrieved data
ld.addEventListener(Event.COMPLETE, function (ev:Event) : void {
_resources[id] = ev.target.data;
callback(ev.target.data);
});
ld.load (/* URLRequest here */);
_loader[id] = ld;
}
// return nothing for now
}
}
[edit] 删除了错误的评论“// URLLoader对象必须由类变量保存以避免GC”。但是仍需要_loader来记住哪个id正在加载。
答案 1 :(得分:0)
我担心你不能...... flash player是单线程的(至少对于几乎所有重要的线程),这就是为什么所有I / O操作都是异步的。
圆环提出的解决方案是你能得到的最佳解决方案。