工作中用的一个比较方便的事件系统
管理所有事件:注册、移除、广播
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销毁时撤销注册的事件