From bb23a5caf11acf4f09a8709aab72b2a317d04da5 Mon Sep 17 00:00:00 2001 From: Ray Greenwell Date: Wed, 12 Mar 2008 00:31:19 +0000 Subject: [PATCH] Two fixes: - Added a mechanism for testing if something is already loaded after generation. DataPacks load immediately if passed a ByteArray. Loaders will always wait a frame, so I was going to change DataPack to follow that behavior, but it's nice that it just works right after construction. - If a singleton source was passed in and resulted in an error (or, now, it can already be loaded as well) then it would incorrectly return as the result the internal wrapper object for the single result. git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@4969 542714f4-19e9-0310-aa3c-eee0fc999fb1 --- src/as/com/threerings/util/MultiLoader.as | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/as/com/threerings/util/MultiLoader.as b/src/as/com/threerings/util/MultiLoader.as index 99c0f0053..999a079a2 100644 --- a/src/as/com/threerings/util/MultiLoader.as +++ b/src/as/com/threerings/util/MultiLoader.as @@ -154,13 +154,16 @@ public class MultiLoader * @param completeCallack the function to call when complete. * @param forEach whether to call the completeCallback for each source, or all-at-once at * the end. If forEach is used, keys will never be returned. + * @param isCompleteCheckFn a function to attempt to call on the dispatcher to see if + * it's already complete after generation. * @param errorTypes an Array of event types that will be dispatched by the loader. * If unspecifed, all the normal error event types are used. * @param completeType, the event complete type. If unspecifed @default Event.COMPLETE. */ public function MultiLoader ( sources :Object, generatorFn :Function, completeCallback :Function, - forEach :Boolean = false, errorTypes :Array = null, completeType :String = null) + forEach :Boolean = false, isCompleteCheckFn :String = null, + errorTypes :Array = null, completeType :String = null) { if (errorTypes == null) { errorTypes = [ ErrorEvent.ERROR, AsyncErrorEvent.ASYNC_ERROR, @@ -173,6 +176,7 @@ public class MultiLoader _complete = completeCallback; _forEach = forEach; + var endCheckKey :* = null; if (sources is Array) { _result = new Array(); @@ -184,6 +188,7 @@ public class MultiLoader if (!Util.isPlainObject(sources)) { // stash the singleton source sources = { singleton_key: sources }; + endCheckKey = "singleton_key"; } } @@ -198,12 +203,14 @@ public class MultiLoader } _result[key] = val; if (val is IEventDispatcher) { - var ed :IEventDispatcher = IEventDispatcher(val); - _remaining++; - _targetsToKeys[ed] = key; - ed.addEventListener(completeType, handleComplete); - for each (var type :String in errorTypes) { - ed.addEventListener(type, handleError); + if (isCompleteCheckFn == null || !val[isCompleteCheckFn]()) { + var ed :IEventDispatcher = IEventDispatcher(val); + _remaining++; + _targetsToKeys[ed] = key; + ed.addEventListener(completeType, handleComplete); + for each (var type :String in errorTypes) { + ed.addEventListener(type, handleError); + } } } else if (_forEach) { checkReport(key); @@ -211,7 +218,7 @@ public class MultiLoader } if (!_forEach) { - checkReport(null); + checkReport(endCheckKey); } }