/// <summary> /// 其实注销消息只需要Object和Go就足够了 不需要callback /// </summary> public static void UnRegisterMsgByChannel(this IMsgReceiver self, TMsgChannel channel, string msgName) { if (CheckStrNullOrEmpty(msgName)) { return; } if (!mMsgHandlerDict.ContainsKey(channel)) { Debug.LogError("Channel:" + channel.ToString() + " doesn't exist"); return; } var handlers = mMsgHandlerDict[channel][msgName]; int handlerCount = handlers.Count; // 删除List需要从后向前遍历 for (int index = handlerCount - 1; index >= 0; index--) { var handler = handlers[index]; if (handler.receiver == self) { handlers.Remove(handler); break; } } }
/// <summary> /// 发送消息 -- 自定义模式,发送到全局类型 TMsgChannel.Global /// </summary> protected void GoSendMsgByChannel(TMsgChannel channel, string msgName, params object[] paramList) { if (string.IsNullOrEmpty(msgName)) { return; } this.SendMsgByChannel(channel, msgName, paramList); }
/// <summary> /// 释放注册消息 -- 自定义模式 /// </summary> /// <param name="channel">消息类型</param> /// <param name="msgName">消息名称</param> protected void GoUnRegisterMsgByChannel(TMsgChannel channel, string msgName) { // 检测空变量 if (string.IsNullOrEmpty(msgName)) { Debug.LogError("UnRegisterMsg:" + msgName + " is Null or Empty"); return; } this.UnRegisterMsgByChannel(channel, msgName); }
/// <summary> /// 注册消息, /// 注意第一个参数,使用了C# this的扩展, /// 所以只有实现IMsgReceiver的对象才能调用此方法 /// </summary> public static void RegisterMsgByChannel(this IMsgReceiver self, TMsgChannel channel, string msgName, VoidDelegate.WithParams callback) { // 略过 if (string.IsNullOrEmpty(msgName)) { Debug.LogError("RegisterMsg:" + msgName + " is Null or Empty"); return; } // 略过 if (null == callback) { Debug.LogError("RegisterMsg:" + msgName + " callback is Null"); return; } // 添加消息通道 if (!mMsgHandlerDict.ContainsKey(channel)) { mMsgHandlerDict[channel] = new Dictionary <string, List <TMsgHandler> >(); } // 略过 if (!mMsgHandlerDict[channel].ContainsKey(msgName)) { mMsgHandlerDict[channel][msgName] = new List <TMsgHandler>(); } // 看下这里 var handlers = mMsgHandlerDict[channel][msgName]; // 略过 // 防止重复注册 foreach (var handler in handlers) { if (handler.receiver == self && handler.callback == callback) { Debug.LogWarning("RegisterMsg:" + msgName + " ayready Register"); return; } } // 再看下这里 handlers.Add(new TMsgHandler(self, callback)); }
public static void SendMsgByChannel(this IMsgSender sender, TMsgChannel channel, string msgName, params object[] paramList) { if (CheckStrNullOrEmpty(msgName)) { return; } if (!mMsgHandlerDict.ContainsKey(channel)) { Debug.LogError("Channel:" + channel.ToString() + " doesn't exist"); return; } // 略过,不用看 if (!mMsgHandlerDict[channel].ContainsKey(msgName)) { Debug.LogWarning("SendMsg is UnRegister"); return; } // 开始看!!!! var handlers = mMsgHandlerDict[channel][msgName]; var handlerCount = handlers.Count; // 之所以是从后向前遍历,是因为 从前向后遍历删除后索引值会不断变化 // 参考文章,http://www.2cto.com/kf/201312/266723.html for (int index = handlerCount - 1; index >= 0; index--) { var handler = handlers[index]; if (handler.receiver != null) { Debug.Log("SendLogicMsg:" + msgName + " Succeed"); handler.callback(paramList); } else { handlers.Remove(handler); } } }
//注册消息 /// <summary> /// 注册消息 -- 自定义类型模式 /// </summary> /// <param name="channel">消息类型</param> /// <param name="msgName">消息名称</param> /// <param name="callback">回调</param> protected void GoRegisterMsgByChannel(TMsgChannel channel, string msgName, VoidDelegate.WithParams callback) { // 检测空变量 if (string.IsNullOrEmpty(msgName)) { Debug.LogError("RegisterMsg:" + msgName + " is Null or Empty"); return; } // 检测空变量 if (null == callback) { Debug.LogError("RegisterMsg:" + msgName + " callback is Null"); return; } //如果词典为空 则新建 if (m_msgHandlerDict == null) { m_msgHandlerDict = new Dictionary <TMsgChannel, List <string> >(); } // 添加消息通道 if (!m_msgHandlerDict.ContainsKey(TMsgChannel.Global)) { m_msgHandlerDict[channel] = new List <string>(); } // 检测是否存在 不存在 则添加 if (!m_msgHandlerDict[channel].Contains(msgName)) { m_msgHandlerDict[channel].Add(msgName); } this.RegisterMsgByChannel(channel, msgName, callback); }