fixes
This commit is contained in:
96
haxework/net/order/OrderSupplier.hx
Executable file
96
haxework/net/order/OrderSupplier.hx
Executable file
@@ -0,0 +1,96 @@
|
||||
package haxework.net.order;
|
||||
|
||||
import Lambda;
|
||||
import haxework.net.callback.Callback;
|
||||
import Type.ValueType;
|
||||
import com.abit.umix.prepare.AutoCallback;
|
||||
import flash.display.BitmapData;
|
||||
import haxework.net.callback.ICallback;
|
||||
|
||||
typedef Order<T> = {
|
||||
var id:String;
|
||||
var data:Null<T>;
|
||||
var callbacks:Array<ICallback<T>>;
|
||||
var clients:Int;
|
||||
}
|
||||
|
||||
class OrderSupplier implements IOrderSupplier {
|
||||
|
||||
private static inline var TAG:String = "OrderSupplier";
|
||||
|
||||
private var orders:Map<String, Order<Dynamic>>;
|
||||
|
||||
public function new() {
|
||||
orders = new Map<String, Order<Dynamic>>();
|
||||
}
|
||||
|
||||
public function request<T>(url:String, clazz:Class<T>):ICallback<T> {
|
||||
if (orders.exists(url)) {
|
||||
var order:Order<T> = orders.get(url);
|
||||
order.clients++;
|
||||
//L.d(TAG, "Request(" + order.clients + "): " + url);
|
||||
if (order.data == null) {
|
||||
var callback:ICallback<T> = new Callback<T>();
|
||||
order.callbacks.push(callback);
|
||||
return callback;
|
||||
} else {
|
||||
return AutoCallback.success(order.data);
|
||||
}
|
||||
} else {
|
||||
var callback:ICallback<T> = new Callback<T>();
|
||||
var order:Order<T> = {
|
||||
id:url,
|
||||
data:null,
|
||||
callbacks:[callback],
|
||||
clients:1
|
||||
}
|
||||
//L.d(TAG, "Request(" + order.clients + "): " + url);
|
||||
orders.set(url, order);
|
||||
var loader:ILoader<T> = buildLoader(clazz);
|
||||
loader.GET(url)
|
||||
.success(function(data:T):Void {
|
||||
if (orders.exists(url)) {
|
||||
var order:Order<T> = orders.get(url);
|
||||
order.data = data;
|
||||
for (callback in order.callbacks) callback.callSuccess(data);
|
||||
order.callbacks = [];
|
||||
}
|
||||
})
|
||||
.fail(function(error:Dynamic):Void {
|
||||
if (orders.exists(url)) for (callback in orders.get(url).callbacks) callback.callFail(error);
|
||||
orders.remove(url);
|
||||
});
|
||||
return callback;
|
||||
}
|
||||
}
|
||||
|
||||
public function release(url:String):Void {
|
||||
if (orders.exists(url)) {
|
||||
var order:Order<Dynamic> = orders.get(url);
|
||||
if (--order.clients <= 0) {
|
||||
var data:Dynamic = order.data;
|
||||
if (Std.is(data, BitmapData)) {
|
||||
cast(data, BitmapData).dispose();
|
||||
}
|
||||
orders.remove(url);
|
||||
}
|
||||
//L.d(TAG, "Release(" + order.clients + "): " + url);
|
||||
//log();
|
||||
}
|
||||
}
|
||||
|
||||
private function buildLoader<T>(clazz:Class<T>):ILoader<T> {
|
||||
var c:Class<Dynamic> = clazz;
|
||||
return if (c == BitmapData) {
|
||||
untyped new ImageLoader();
|
||||
} else {
|
||||
throw "Unsupported order: " + c;
|
||||
}
|
||||
}
|
||||
|
||||
private function log():Void {
|
||||
L.d(TAG, "\n" + Lambda.map(orders, function(order:Order<Dynamic>):String {
|
||||
return "(" + order.clients + ") " + order.id;
|
||||
}).join("\n"));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user