/// <summary> /// 注册消息处理 /// </summary> /// <param name="self">this扩展,this必须是 ImsgReceiver 的实例</param> /// <param name="MsgType"> 消息名 </param> /// <param name="Callback"> 回调函数,无返回值,支持任意类型,任意长度的参数 </param> public static void AddMessageHandler(this IMsgReceiver self, ECustomMessageType MsgType, DelegateCustomMessage Callback) { if (MsgType == ECustomMessageType.NULL) { CLOG.E("error msg type is {0}", MsgType); return; } if (Callback == null) { CLOG.E("none call back!!", MsgType); return; } if (!m_MsgHandlerList.ContainsKey(MsgType)) { // 如果不包含这个Key,那么就创建他 m_MsgHandlerList[MsgType] = new List <LogicMsgHandler>(); } // 防止反复注册 foreach (var item in m_MsgHandlerList[MsgType]) { if (item.m_Receiver == self && item.m_Callback == Callback) { return; } } // 注册 m_MsgHandlerList[MsgType].Add(new LogicMsgHandler(self, Callback)); }
/// <summary> /// 移除掉某个对象身上的事件处理 /// 一般在他的OnDestory里执行 /// </summary> /// <param name="self">this 扩展,扩展对象必须是IMsgReceiver 的实例</param> /// <param name="MsgType">消息类型</param> public static void RemoveMessageHandler(this IMsgReceiver self, ECustomMessageType MsgType) { if (MsgType == ECustomMessageType.NULL) { CLOG.E("error msg type is {0}", MsgType); return; } // 没有注册该消息时的处理 if (!m_MsgHandlerList.ContainsKey(MsgType)) { return; } // 得到所有注册的处理 var Handlers = m_MsgHandlerList[MsgType]; // 得到数量 var HandlerCount = Handlers.Count; // 倒序遍历,防止删除引起的循环异常 for (int i = HandlerCount - 1; i >= 0; i--) { var Handler = Handlers[i]; // 存在处理对象才调用 if (Handler.m_Receiver == self) { Handlers.Remove(Handler); } } }
/// <summary> /// 消息发送处理 /// </summary> /// <param name="self">this扩展,this必须是 IMsgSender的实例</param> /// <param name="MsgType">要发送的消息类型</param> /// <param name="paramList">要发送的参数,支持任意类型,任意长度的参数</param> public static void DispatchMessage(this IMsgSender self, ECustomMessageType MsgType, params Object[] paramList) { if (MsgType == ECustomMessageType.NULL) { CLOG.E("error msg type is {0}", MsgType); return; } // 没有注册该消息时的处理 if (!m_MsgHandlerList.ContainsKey(MsgType)) { return; } // 得到所有注册的处理 var Handlers = m_MsgHandlerList[MsgType]; // 得到数量 var HandlerCount = Handlers.Count; // 倒序遍历,防止删除引起的循环异常 for (int i = HandlerCount - 1; i >= 0; i--) { var Handler = Handlers[i]; // 存在处理对象才调用 if (Handler.m_Receiver != null) { Handler.m_Callback(paramList); } else { Handlers.Remove(Handler); } } }