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); }
/// <summary> /// 更新Listener节点树 /// </summary> public void UpdateListenerTree() { if (!IsNodeActive) { return; } if (IsListenerTreeNeedsUpdate) { IsListenerTreeNeedsUpdate = false; //注意,这个Update是深度优先的,防止子节点的异步操作被跳过// for (int i = 0; i < mSubNodes.Count; i++) { mSubNodes[i].mLogicNode.UpdateListenerTree(); } for (int i = 0; i < mAsyncListenerOps.Count; i++) { EventListenerUpdateOperation op = mAsyncListenerOps[i]; if (op.mIsAddOrRemove) { _AttachListenerSync(op.mEventKey, op.mListener); } else { _DetachListenerSync(op.mEventKey, op.mListener); } } mAsyncListenerOps.Clear(); } }
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); }