/*** * writer: YKMoon * desc: 事件监听机制,通用被观测者 ***/ using UnityEngine; using System; using System.Collections; using System.Collections.Generic; namespace YKMoon { public static class YKEvent { private static Dictionary> eventsTable = new Dictionary>(); static YKEvent() { YKEventManager.RegYKEventInstance(eventsTable); } public static void AddListener(int eventType, Action handler) { List list = null; if(!eventsTable.TryGetValue(eventType, out list)) { eventsTable.Add(eventType, new List()); list = eventsTable[eventType]; } if(!list.Contains(handler)) { list.Add(handler); } } public static void RemoveListener(int eventType, Action handler) { List list = null; if(eventsTable.TryGetValue(eventType, out list)) { if(list.Contains(handler)) { list.Remove(handler); } } } public static void Post(int eventType) { List list = null; if(eventsTable.TryGetValue(eventType, out list)) { List cache = ListPool.Get(); cache.AddRange(list); for(var i = cache.Count - 1; i >= 0; i--) { cache[i]?.Invoke(); } ListPool.Release(cache); } } public static void Clear(int eventType) { if(eventsTable.ContainsKey(eventType)) eventsTable.Remove(eventType); } public static void Clear() { eventsTable.Clear(); } } public static class YKEvent { private static Dictionary>> eventsTable = new Dictionary>>(); static YKEvent() { YKEventManager.RegYKEventInstance(eventsTable); } public static void AddListener(int eventType, Action handler) { List> list = null; if(!eventsTable.TryGetValue(eventType, out list)) { eventsTable.Add(eventType, new List>()); list = eventsTable[eventType]; } if(!list.Contains(handler)) { list.Add(handler); } } public static void RemoveListener(int eventType, Action handler) { List> list = null; if(eventsTable.TryGetValue(eventType, out list)) { if(list.Contains(handler)) { list.Remove(handler); } } } public static void Post(int eventType, U param) { List> list = null; if(eventsTable.TryGetValue(eventType, out list)) { List> cache = ListPool>.Get(); cache.AddRange(list); for(var i = cache.Count - 1; i >= 0; i--) { cache[i]?.Invoke(param); } ListPool>.Release(cache); } } public static void Clear(int eventType) { if(eventsTable.ContainsKey(eventType)) eventsTable.Remove(eventType); } public static void Clear() { eventsTable.Clear(); } } public static class YKEvent { private static Dictionary>> eventsTable = new Dictionary>>(); static YKEvent() { YKEventManager.RegYKEventInstance(eventsTable); } public static void AddListener(int eventType, Action handler) { List> list = null; if(!eventsTable.TryGetValue(eventType, out list)) { eventsTable.Add(eventType, new List>()); list = eventsTable[eventType]; } if(!list.Contains(handler)) { list.Add(handler); } } public static void RemoveListener(int eventType, Action handler) { List> list = null; if(eventsTable.TryGetValue(eventType, out list)) { if(list.Contains(handler)) { list.Remove(handler); } } } public static void Post(int eventType, U firstParam, V secondParam) { List> list = null; if(eventsTable.TryGetValue(eventType, out list)) { List> cache = ListPool>.Get(); cache.AddRange(list); for(var i = cache.Count - 1; i >= 0; i--) { cache[i]?.Invoke(firstParam, secondParam); } ListPool>.Release(cache); } } public static void Clear(int eventType) { if(eventsTable.ContainsKey(eventType)) eventsTable.Remove(eventType); } public static void Clear() { eventsTable.Clear(); } } public static class YKEvent { private static Dictionary>> _eventsTable = new Dictionary>>(); static YKEvent() { YKEventManager.RegYKEventInstance(_eventsTable); } public static void AddListener(int eventType, Action handler) { List> list = null; if(!_eventsTable.TryGetValue(eventType, out list)) { _eventsTable.Add(eventType, new List>()); list = _eventsTable[eventType]; } if(!list.Contains(handler)) list.Add(handler); } public static void RemoveListener(int eventType, Action handler) { List> list = null; if(_eventsTable.TryGetValue(eventType, out list)) { if(list.Contains(handler)) { list.Remove(handler); } } } public static void Post(int eventType, K firstParam, U secondParam, V thirdParam) { List> list = null; if(_eventsTable.TryGetValue(eventType, out list)) { List> cache = ListPool>.Get(); cache.AddRange(list); for(var i = cache.Count - 1; i >= 0; i--) { cache[i]?.Invoke(firstParam, secondParam, thirdParam); } ListPool>.Release(cache); } } public static void Clear(int eventType) { if(_eventsTable.ContainsKey(eventType)) _eventsTable.Remove(eventType); } public static void Clear() { _eventsTable.Clear(); } } #region YKEventManager public static class YKEventManager { private static List msgTables = new List(); internal static void RegYKEventInstance(IDictionary msgTable) { msgTables.Add(msgTable); } public static void ClearAll() { for(int i = 0; i < msgTables.Count; i++) { msgTables[i].Clear(); } } public static void Clear(int beginID, int endID) { for(int i = beginID; i < endID; ++i) { IDictionary table = FindMessageTable(i); if(table != null) { table.Remove(i); } } } private static IDictionary FindMessageTable(int id) { for(int i = 0; i < msgTables.Count; ++i) { if(msgTables[i].Contains(id)) { return msgTables[i]; } } return null; } } #endregion YKEventManager }