public void AsyncLoad(string url, AsyncLoadCallBack.CallBack onAsyncRequestCallBack, object context)
        {
            url = url + GetExtension( );
            //UnityEngine.Debug.Log( string.Format( " ## {0}", url ) );

            AssetBundleCache cab = _cacheMgr.GetAssetBundle(url);

            if (cab == null)
            {
                CreateRequest(url, onAsyncRequestCallBack, context);
                return;
            }

            // 缓存中已有AB数据,检查一下依赖项量是否完成(有可能正在加载)
            string[] dependsObj = GetAbDependencies(url);
            if (dependsObj == null)
            {
                // 没有依赖项,缓存中已有AB数据,直接回调
                if (onAsyncRequestCallBack != null)
                {
                    onAsyncRequestCallBack(context, cab.AB);
                }

                return;
            }

            // 遍历依赖项是否在缓存中
            bool isOk = true;

            foreach (var one in dependsObj)
            {
                if (_cacheMgr.GetAssetBundle(one) != null)
                {
                    continue;
                }

                isOk = false;
                break;
            }

            if (isOk)
            {
                // 缓存中有全部数据,直接回调
                if (onAsyncRequestCallBack != null)
                {
                    onAsyncRequestCallBack(context, cab.AB);
                }
                return;
            }

            // AB包不全,需要创建requset
            CreateRequest(url, onAsyncRequestCallBack, context);
        }
        private void CreateRequest(string url, AsyncLoadCallBack.CallBack onAsyncRequestCallBack, object context)
        {
            // ①:先创建一个回调
            AsyncLoadCallBack callbackFun = new AsyncLoadCallBack(onAsyncRequestCallBack, context);

            // ③是否已有加载数据,已有,注册一个回调函数,等待返回
            if (_requests.ContainsKey(url))
            {
                _requests[url].Callbacks.Add(callbackFun);
                return;
            }

            // ②:没有加载相关数据,新建一个异步请求,注册一个回调函数
            // url可能已存在于缓存,需要请求的是依赖项
            AsyncLoadRequest request =
                new AsyncLoadRequest(url, AssetBundleMgr.GetInstance( ).GetAbDependencies(url));

            request.Callbacks.Add(callbackFun);
            _requests.Add(url, request);

            AssetBundle ab = GetAb(url);

            if (ab == null)
            {
                RegisterLoadedCallBack(url, request.UrlLoadedCallBack);
            }
            else
            {
                // 主ab包已经加载了,需要加载的是依赖包
                string depsUrl = request.GetUnLoadUrl( );
                RegisterLoadedCallBack(depsUrl, request.UrlLoadedCallBack);
                url = depsUrl;
            }

            // ④:没有正在下载的相同url,排个队
            if (!IsLoading(url))
            {
                _waitingQueue.Enqueue(url);
            }
        }