From 347b266f7899e7c3e62d4c190146b5acc3ba2fff Mon Sep 17 00:00:00 2001 From: Calvin Rien Date: Tue, 3 Oct 2023 19:23:41 -0700 Subject: [PATCH 1/2] Receive unregister callback when removing listener --- Runtime/ServiceLocator.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Runtime/ServiceLocator.cs b/Runtime/ServiceLocator.cs index 25c07db..7a9c8fd 100644 --- a/Runtime/ServiceLocator.cs +++ b/Runtime/ServiceLocator.cs @@ -75,6 +75,7 @@ public static void AddServiceListener(Action serviceCallback) where return; } + // If the service is registered immediately notify the listener if (TryGetService(out var service)) { serviceCallback.Invoke(service, true); @@ -103,6 +104,13 @@ public static void RemoveServiceListener(Action serviceCallback) whe return; } + // If the service is registered immediately notify the listener + if (TryGetService(out var service)) + { + // behave as if the service unregistered. + callbackWrapper.Invoke(service, false); + } + var type = typeof(T); if (k_Callbacks.ContainsKey(type)) From d3e6c6d224ec1283c02e321676dfd1499339bef2 Mon Sep 17 00:00:00 2001 From: Calvin Rien Date: Mon, 24 Jun 2024 17:03:30 -0700 Subject: [PATCH 2/2] Add a delegate to Add/Remove listener make TryGetService public. --- Runtime/ServiceLocator.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Runtime/ServiceLocator.cs b/Runtime/ServiceLocator.cs index 7a9c8fd..a3cd782 100644 --- a/Runtime/ServiceLocator.cs +++ b/Runtime/ServiceLocator.cs @@ -11,6 +11,7 @@ public interface IService { } public static class ServiceLocator { + public delegate void ServiceCallback(T service, bool registered); private delegate void ServiceLocatorDelegate(IService service, bool registered); private static readonly Dictionary k_Services = new(); @@ -55,7 +56,7 @@ public static bool Unregister(T service) where T : class, IService return false; } - private static bool TryGetService(out T result) where T : class, IService + public static bool TryGetService(out T result) where T : class, IService { if (k_Services.TryGetValue(typeof(T), out var service)) { @@ -67,7 +68,7 @@ private static bool TryGetService(out T result) where T : class, IService return false; } - public static void AddServiceListener(Action serviceCallback) where T : class, IService + public static void AddServiceListener(ServiceCallback serviceCallback) where T : class, IService { if (k_RegisteredCallbacks.ContainsKey(serviceCallback)) { @@ -97,7 +98,7 @@ public static void AddServiceListener(Action serviceCallback) where k_RegisteredCallbacks.Add(serviceCallback, callbackWrapper); } - public static void RemoveServiceListener(Action serviceCallback) where T : class, IService + public static void RemoveServiceListener(ServiceCallback serviceCallback) where T : class, IService { if (!k_RegisteredCallbacks.TryGetValue(serviceCallback, out var callbackWrapper)) {