public static void UnRegisterMsg(this IMsgReceiver self, string msgName, QVoidDelegate.WithParams callback, QMgrID channel = QMgrID.Global) { if (CheckStrNullOrEmpty(msgName) || CheckDelegateNull(callback)) { 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 && handler.callback == callback) { handlers.Remove(handler); break; } } }
/// <summary> /// 其实注销消息只需要Object和Go就足够了 不需要callback /// </summary> public static void UnRegisterMsgByChannel(this IMsgReceiver self, QMgrID 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; } } }
public static void SendMsgByChannel(this IMsgSender sender, QMgrID 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); } } }