69 lines
2.3 KiB
C#
69 lines
2.3 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using Cysharp.Threading.Tasks;
|
|
using UnityEngine;
|
|
|
|
namespace Code.Infrastructure.EventBus
|
|
{
|
|
public class EventBus
|
|
{
|
|
private Dictionary<Type, SubscribersList<IGlobalSubscriber>> s_Subscribers
|
|
= new();
|
|
|
|
public void Subscribe(IGlobalSubscriber subscriber)
|
|
{
|
|
List<Type> subscriberTypes = EventBusHelper.GetSubscriberTypes(subscriber);
|
|
foreach (Type t in subscriberTypes)
|
|
{
|
|
if (!s_Subscribers.ContainsKey(t))
|
|
{
|
|
s_Subscribers[t] = new SubscribersList<IGlobalSubscriber>();
|
|
}
|
|
s_Subscribers[t].Add(subscriber);
|
|
}
|
|
}
|
|
|
|
public void Unsubscribe(IGlobalSubscriber subscriber)
|
|
{
|
|
List<Type> subscriberTypes = EventBusHelper.GetSubscriberTypes(subscriber);
|
|
foreach (Type t in subscriberTypes)
|
|
{
|
|
if (s_Subscribers.ContainsKey(t))
|
|
s_Subscribers[t].Remove(subscriber);
|
|
}
|
|
}
|
|
|
|
public void RaiseEvent<TSubscriber>(Action<TSubscriber> action)
|
|
where TSubscriber : class, IGlobalSubscriber
|
|
{
|
|
if (!s_Subscribers.ContainsKey(typeof(TSubscriber))) return;
|
|
|
|
SubscribersList<IGlobalSubscriber> subscribers = s_Subscribers[typeof(TSubscriber)];
|
|
|
|
subscribers.Executing = true;
|
|
|
|
InvokeSubscribers(action, subscribers);
|
|
|
|
subscribers.Executing = false;
|
|
subscribers.Cleanup();
|
|
}
|
|
|
|
private void InvokeSubscribers<TSubscriber>(Action<TSubscriber> action, SubscribersList<IGlobalSubscriber> subscribers)
|
|
where TSubscriber : class, IGlobalSubscriber
|
|
{
|
|
for ( int i = 0; i < subscribers.List.Count; i++)
|
|
{
|
|
Debug.Log("Invoking " + typeof(TSubscriber).Name);
|
|
IGlobalSubscriber subscriber = subscribers.List[i];
|
|
try
|
|
{
|
|
action.Invoke(subscriber as TSubscriber);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
Debug.LogError(e);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |