Exemplo n.º 1
0
        private bool _AttachListenerAsync(int inEventKey, IGEventListener inListener)
        {
            bool ret = false;

            if (inListener == null)
            {
                Log.LMN.LogUtil.Error("MBLogicNode._AttachListenerAsync: inLogicNode is null");
                return(ret);
            }

            //置脏,导致这棵子树需要进入更新流程//
            IsListenerTreeNeedsUpdate = true;
            IGLogicNode parent = ParentNode;

            while (parent != null && !parent.IsListenerTreeNeedsUpdate)
            {
                parent.IsListenerTreeNeedsUpdate = true;
                parent = parent.ParentNode;
            }

            EventListenerUpdateOperation updateOp = new EventListenerUpdateOperation();

            updateOp.mListener      = inListener;
            updateOp.mIsAddOrRemove = true;
            updateOp.mEventKey      = inEventKey;
            mAsyncListenerOps.Add(updateOp);

            inListener.ListenerStatus = AttachableStatus.Attaching;

            ret = true;
            return(ret);
        }
Exemplo n.º 2
0
        /// <summary>
        /// 引发消息处理
        /// </summary>
        /// <param name="inEvent">Evt.</param>
        public bool TriggerEvent(IGEvent inEvent)
        {
            List <GEventListenerWrapper> listenerList = null;

            if (mEventListenerMap.TryGetValue(inEvent.EventKey, out listenerList))
            {
                for (int i = 0; i < listenerList.Count; i++)
                {
                    GEventListenerWrapper wrapper  = listenerList[i];
                    IGEventListener       listener = wrapper.mEventListenerWeakRef.Target as IGEventListener;
                    try
                    {
                        if (listener != null &&
                            listener.ListenerStatus != AttachableStatus.Detaching &&
                            listener.HandleEvent(inEvent))
                        {
                            //说明这个监听器要求拦截消息,终止消息的继续广播//
                            return(true);
                        }
                    }
                    catch (Exception e)
                    {
                        Log.LMN.LogUtil.Error("MBLogicNode.TriggerEvent: listener -> {0}, excepton -> {1}", listener, e);
                    }
                }
            }
            return(false);
        }
Exemplo n.º 3
0
        private bool _DetachListenerAsync(int inEventKey, IGEventListener inListener)
        {
            bool ret = false;

            if (inListener == null)
            {
                Log.LMN.LogUtil.Error("MBLogicNode._DetachListenerAsync: inLogicNode is null");
                return(ret);
            }

            //置脏,导致这棵子树需要进入更新流程//
            IsListenerTreeNeedsUpdate = true;
            IGLogicNode parent = ParentNode;

            while (parent != null && !parent.IsListenerTreeNeedsUpdate)
            {
                parent.IsListenerTreeNeedsUpdate = true;
                parent = parent.ParentNode;
            }

            List <GEventListenerWrapper> listenerWrappers = null;

            if (!mEventListenerMap.TryGetValue(inEventKey, out listenerWrappers))
            {
                Log.LMN.LogUtil.Error("MBLogicNode._DetachListenerAsync: no event listener for -> {0} on {1}", inEventKey, inListener);
                return(ret);
            }

            //快速找出需要移除的节点位置//
            int priority = inListener.GetPriority(inEventKey);
            int index    = PrioritySortUtil.GetDecSeqRefArrayFirstIndex <GEventListenerWrapper>(priority, listenerWrappers);

            for (int i = index; i < listenerWrappers.Count && listenerWrappers[i].PriorityVal == priority; i++)
            {
                GEventListenerWrapper wrapper = listenerWrappers[i];
                object listenerObj            = wrapper.mEventListenerWeakRef.Target;
                if (listenerObj == inListener)
                {
                    inListener.ListenerStatus = AttachableStatus.Detaching;
                    ret = true;
                    break;
                }
            }

            if (ret)
            {
                EventListenerUpdateOperation updateOp = new EventListenerUpdateOperation();
                updateOp.mListener      = inListener;
                updateOp.mIsAddOrRemove = false;
                updateOp.mEventKey      = inEventKey;
                mAsyncListenerOps.Add(updateOp);
            }

            return(ret);
        }
Exemplo n.º 4
0
        /// <summary>
        /// 1.从本逻辑节点上摘除监听inEventKey的inListener消息监听器
        /// 2.会在以下方法中生成异步操作DispatchEvent, 参见IsListenerTreeLocked
        /// 3.消息监听器的在逻辑节点中是以弱引用存在的,你必须自己管理它的生命周期
        /// </summary>
        /// <param name="inEventKey"></param>
        /// <param name="inListener"></param>
        /// <returns></returns>
        public virtual bool DetachListener(int inEventKey, IGEventListener inListener)
        {
            bool ret = false;

            if (IsListenerTreeLocked)
            {
                ret = _DetachListenerAsync(inEventKey, inListener);
            }
            else
            {
                ret = _DetachListenerSync(inEventKey, inListener);
            }

            return(ret);
        }
Exemplo n.º 5
0
        private bool _DetachListenerSync(int inEventKey, IGEventListener inListener)
        {
            bool ret = false;

            if (inListener == null)
            {
                //请替换成你的log函数//
                Log.LMN.LogUtil.Error("ObjLogicNode._DetachListenerSync: inLogicNode is null");
                return(ret);
            }

            List <GEventListenerWrapper> listenerWrappers = null;

            if (!mEventListenerMap.TryGetValue(inEventKey, out listenerWrappers))
            {
                //请替换成你的log函数//
                Log.LMN.LogUtil.Error("ObjLogicNode._DetachListenerSync: no event listener for -> {0} on {1}", inEventKey, inListener);
                return(ret);
            }

            //快速找出需要移除的节点位置,注意这里其实兼顾了同一优先级节点的GC功能//
            int priority = inListener.GetPriority(inEventKey);
            int index    = PrioritySortUtil.GetDecSeqRefArrayFirstIndex <GEventListenerWrapper>(priority, listenerWrappers);
            List <GEventListenerWrapper> listenersToRemove = new List <GEventListenerWrapper>();

            for (int i = index; i < listenerWrappers.Count && listenerWrappers[i].PriorityVal == priority; i++)
            {
                GEventListenerWrapper wrapper = listenerWrappers[i];
                object listenerObj            = wrapper.mEventListenerWeakRef.Target;
                if (listenerObj == null || listenerObj == inListener)
                {
                    listenersToRemove.Add(wrapper);
                }
            }

            for (int i = 0; i < listenersToRemove.Count; i++)
            {
                listenerWrappers.Remove(listenersToRemove[i]);
            }

            inListener.ListenerStatus = AttachableStatus.Detached;

            ret = listenersToRemove.Count != 0;
            return(ret);
        }
Exemplo n.º 6
0
        private bool _AttachListenerSync(int inEventKey, IGEventListener inListener)
        {
            bool ret = false;

            if (inListener == null)
            {
                //请替换成你的log函数//
                Log.LMN.LogUtil.Error("ObjLogicNode._AttachListenerSync: inLogicNode is null");
                return(ret);
            }

            List <GEventListenerWrapper> eventListenerList = null;

            if (!mEventListenerMap.TryGetValue(inEventKey, out eventListenerList))
            {
                eventListenerList = new List <GEventListenerWrapper>();
                mEventListenerMap.Add(inEventKey, eventListenerList);
            }

#if DEBUG_G_LOGIC_NODE
            for (int i = 0; i < eventListenerList.Count; i++)
            {
                GEventListenerWrapper wrapper = eventListenerList[i];
                if (wrapper.mEventListenerWeakRef.IsAlive &&
                    wrapper.mEventListenerWeakRef.Target == inListener)
                {
                    //请替换成你的log函数//
                    Log.LMN.LogUtil.Error("ObjLogicNode._AttachListenerSync: duplicated -> " + inListener + ", in -> " + this + ", for -> " + inEventKey);
                    return(ret);
                }
            }
#endif

            int priority = inListener.GetPriority(inEventKey);
            GEventListenerWrapper listenerWrapper;
            listenerWrapper.mEventListenerWeakRef  = new WeakReference(inListener);
            listenerWrapper.mEventListenerPriority = priority;
            inListener.ListenerStatus = AttachableStatus.Attached;

            int index = PrioritySortUtil.GetDecSeqRefArrayInsertIndex <GEventListenerWrapper>(priority, eventListenerList);
            eventListenerList.Insert(index, listenerWrapper);

            ret = true;
            return(ret);
        }