//删除一个发送者,这个时候连它的监听者也会被删除 public static void Remove(EventNotifier notifier) { notifier.isRemove = true; if (m_fireCount > 0) { m_delayRemovesNotifiers.Add(notifier);//fire中的话,等到fire后才删除 return; } if (notifier.observersById.Count != 0)//如果不加这一行,会导致foreach里有GC Alloc { foreach (EventObserver observer in notifier.observersById.Values) { AllFireNotifier.Remove(observer); if (!m_observersById.Remove(observer.Id)) { Debuger.LogError(string.Format("删除了不存在的监听者:{0}", observer.Id)); } IdTypePool <EventObserver> .Put(observer); } } if (!m_notifiersById.Remove(notifier.Id)) { Debuger.LogError(string.Format("删除了不存在的发送者:{0}", notifier.Id)); } IdTypePool <EventNotifier> .Put(notifier); }
public static EventNotifier Get() { EventNotifier notifier = IdTypePool <EventNotifier> .Get(); notifier.Init(); m_notifiersById.Add(notifier.Id, notifier); return(notifier); }
static int DoAddAll(int msg, int code, object onFire) { EventObserver observer = IdTypePool <EventObserver> .Get(); observer.Init(null, msg, code, true, onFire); AllNotifier.Add(observer); m_observersById.Add(observer.Id, observer); return(observer.Id); }
//监听,onFire返回false表示否决(之后的监听者不执行) static int DoAdd(EventNotifier notifier, int msg, int code, object onFire) { if (notifier == null || !m_notifiersById.ContainsKey(notifier.Id)) { Debuger.LogError(string.Format("观察对象找不到:{0}", msg + code)); return(Invalid_Id); } EventObserver observer = IdTypePool <EventObserver> .Get(); observer.Init(notifier, msg, code, false, onFire); notifier.Add(observer); AllFireNotifier.Add(observer); m_observersById.Add(observer.Id, observer); return(observer.Id); }
//取消监听 public static void Remove(EventObserver observer) { if (observer.IsInPool) { Debuger.LogError(string.Format("重复删除监听者:{0} {1}", observer.Id, Util.GetDelegateName(observer.GetDelegate()))); return; } if (observer.removeCounter > 0 && m_fireCount > 0) { // Debuger.LogError(string.Format("重复删除监听者:{0} {1}", observer.Id, Util.GetDelegateName(observer.GetDelegate()))); return; } observer.removeCounter = 1; if (m_fireCount > 0) { m_delayRemovesObservers.Add(observer); return; } if (!observer.isAll) { observer.notifier.Remove(observer); AllFireNotifier.Remove(observer); } else { AllNotifier.Remove(observer); } if (!m_observersById.Remove(observer.Id)) { Debuger.LogError(string.Format("删除了不存在的监听者:{0}", observer.Id)); } IdTypePool <EventObserver> .Put(observer); }