一套实用的事件监听系统

工作中用的一个比较方便的事件系统

管理所有事件:注册、移除、广播

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销毁时撤销注册的事件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值