工作中用的一个比较方便的事件系统
管理所有事件:注册、移除、广播
public static class Messenger { private static readonly Dictionary<int, Callback> _dict = new Dictionary<int, Callback>(); public static void AddListener(int eventType, Callback handler) { Callback c = null; if (_dict.TryGetValue(eventType, out c)) { _dict[eventType] = c + handler; } else { _dict.Add(eventType, handler); } } public static void RemoveListener(int eventType, Callback handler) { Callback c = null; if (!_dict.TryGetValue(eventType, out c)) { LogHelper.Error("Attempting to remove listener with for event type {0} but current listener is null.", eventType); return; } _dict[eventType] = c - handler; } public static void Broadcast(int eventType) { Callback c = null; if (_dict.TryGetValue(eventType, out c) && c != null) { c.Invoke(); } } }某一些事件的统一管理:主要用于注册事件的对象销毁时,销毁掉对应的事件
(这里数组保存了当前对象注册的事件)
public class MessengerEventBatch { private static MessengerEventBatch _current; private static readonly List<Action> UnRegisterActionTempList = new List<Action>(16); private Action[] _unRegisterActionAry; private MessengerEventBatch() {} public static MessengerEventBatch Begin() { if (_current != null) { LogHelper.Error("MessengerBatch has Began"); return null; } _current = new MessengerEventBatch(); return _current; } public MessengerEventBatch RegisterEvent(int mt, Callback callback) { if (_current != this) { LogHelper.Error("MessengerEventBatch RegisterEvent Without Begin"); return this; } if (callback == null) { LogHelper.Error("string.IsNullOrEmpty(messenger) || callback == null"); return this; } Messenger.AddListener(mt, callback); UnRegisterActionTempList.Add(() => Messenger.RemoveListener(mt, callback)); return this; } public MessengerEventBatch RegisterEvent<A>(int mt, Callback<A> callback) { if (_current != this) { LogHelper.Error("MessengerEventBatch RegisterEvent Without Begin"); return this; } if (callback == null) { LogHelper.Error("string.IsNullOrEmpty(messenger) || callback == null"); return this; } Messenger<A>.AddListener(mt, callback); UnRegisterActionTempList.Add(() => Messenger<A>.RemoveListener(mt, callback)); return this; } public MessengerEventBatch RegisterEvent<A, B>(int mt, Callback<A, B> callback) { if (_current != this) { LogHelper.Error("MessengerEventBatch RegisterEvent Without Begin"); return this; } if (callback == null) { LogHelper.Error("string.IsNullOrEmpty(messenger) || callback == null"); return this; } Messenger<A, B>.AddListener(mt, callback); UnRegisterActionTempList.Add(() => Messenger<A, B>.RemoveListener(mt, callback)); return this; } public MessengerEventBatch RegisterEvent<A, B, C>(int mt, Callback<A, B, C> callback) { if (_current != this) { LogHelper.Error("MessengerEventBatch RegisterEvent Without Begin"); return this; } if (callback == null) { LogHelper.Error("string.IsNullOrEmpty(messenger) || callback == null"); return this; } Messenger<A, B, C>.AddListener(mt, callback); UnRegisterActionTempList.Add(() => Messenger<A, B, C>.RemoveListener(mt, callback)); return this; } public MessengerEventBatch End() { if (_current != this) { LogHelper.Error("MessengerEventBatch End Without Begin"); return this; } if (UnRegisterActionTempList.Count != 0) { _unRegisterActionAry = UnRegisterActionTempList.ToArray(); UnRegisterActionTempList.Clear(); } _current = null; return this; } public void UnregisterAllEvent() { if (_unRegisterActionAry == null) { return; } for (int i = 0; i < _unRegisterActionAry.Length; i++) { try { _unRegisterActionAry[i].Invoke(); } catch (Exception e) { LogHelper.Warning(e.ToString()); } } _unRegisterActionAry = null; }在UI创建时注册事件,在UI销毁时撤销注册的事件