示例#1
0
    //删除一个发送者,这个时候连它的监听者也会被删除
    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);
    }
示例#2
0
    public static EventNotifier Get()
    {
        EventNotifier notifier = IdTypePool <EventNotifier> .Get();

        notifier.Init();
        m_notifiersById.Add(notifier.Id, notifier);
        return(notifier);
    }
示例#3
0
    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);
    }
示例#4
0
    //监听,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);
    }
示例#5
0
    //取消监听
    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);
    }