public void AddListener(int noticeName, Action <INoticeBase <int> > listener, bool onlyOnce = false) { NoticeHandler <int> handlers; if (mNoticeMapper.ContainsKey(noticeName)) { handlers = mNoticeMapper[noticeName]; } else { handlers = NoticeHandler <int> .Create(noticeName, mObserver); mNoticeMapper[noticeName] = handlers; } if (onlyOnce) { AddOnlyOnceListener(noticeName, listener); if (HasListener(noticeName, listener)) { return; } else { } } else { } handlers.Add(listener); }
public static NoticeHandler <NameT> Create(NameT name, INotificationSender sender = default) { NoticeHandler <NameT> result = new NoticeHandler <NameT> { Name = name, Sender = sender }; return(result); }
private void ClearOnlyOnceListeners(int noticeName, ref NoticeHandler <int> handlers) { if (mOnlyOnceListeners.ContainsKey(noticeName)) { OnlyOnceListenerList list = mOnlyOnceListeners[noticeName]; int max = list.Count; for (int i = 0; i < max; i++) { handlers.Remove(list[i]); } list.Clear(); } else { } }
public void Add(NameT name, Action <INoticeBase <NameT> > handler) { if (mNoticeHandlers == null) { return; } NoticeHandler <NameT> noticeHolder; if (!mNoticeHandlers.IsContainsKey(name)) { noticeHolder = NoticeHandler <NameT> .Create(name); mNoticeHandlers[name] = noticeHolder; } else { noticeHolder = mNoticeHandlers[name]; } noticeHolder.Add(handler); }
/// <summary> /// 对观察者本体派发消息 /// </summary> /// <param name="notice"></param> public void Dispatch(INoticeBase <int> notice) { int noticeName = notice.Name; if (mNoticeMapper.ContainsKey(noticeName)) { NoticeHandler <int> handlers = mNoticeMapper[noticeName]; if (handlers.Sender == mObserver) { handlers.Invoke(ref notice); ClearOnlyOnceListeners(noticeName, ref handlers); } else { } } else { } }
public void RemoveListener(int noticeName, Action <INoticeBase <int> > listener) { NoticeHandler <int> handlers = mNoticeMapper[noticeName]; handlers?.Remove(listener); if (mOnlyOnceListeners.ContainsKey(noticeName)) { OnlyOnceListenerList list = mOnlyOnceListeners[noticeName]; if (list.Contains(listener)) { list.Remove(listener); } else { } } else { } }