using System; using System.Collections.Generic; using UnityEngine; namespace VoxelBusters.CoreLibrary { /// /// Generic callback definition for operations. /// public delegate void Callback(); /// /// Generic callback definition for events. /// public delegate void Callback(TResult result); /// /// Generic callback definition for operations. /// public delegate void CompletionCallback(Error error); /// /// Generic callback definition for operations. /// public delegate void EventCallback(TResult result, Error error); public class CallbackDispatcher : PrivateSingletonBehaviour { #region Fields private Queue m_queue = new Queue(); #endregion #region Static methods public static CallbackDispatcher Initialize() { return GetSingleton(); } public static void InvokeOnMainThread(Callback callback) { // validate arguments if (callback == null) { //DebugLogger.LogWarning("Callback is null."); return; } // add request to queue var manager = GetSingleton(); if (manager) { manager.AddAction(action: () => callback.Invoke()); } } public static void InvokeOnMainThread(CompletionCallback callback, Error error) { // validate arguments if (callback == null) { //DebugLogger.LogWarning("Callback is null."); return; } // add request to queue var manager = GetSingleton(); if (manager) { manager.AddAction(action: () => callback.Invoke(error)); } } public static void InvokeOnMainThread(Callback callback, TResult result) { // validate arguments if (callback == null) { //DebugLogger.LogWarning("Callback is null."); return; } // add request to queue var manager = GetSingleton(); if (manager) { manager.AddAction(() => callback.Invoke(result)); } } public static void InvokeOnMainThread(EventCallback callback, IOperationResultContainer resultContainer) { InvokeOnMainThread(callback, resultContainer.GetResult(), resultContainer.GetError()); } public static void InvokeOnMainThread(EventCallback callback, TResult result, Error error) { // validate arguments if (callback == null) { //DebugLogger.LogWarning("Callback is null."); return; } // add request to queue var manager = GetSingleton(); if (manager) { manager.AddAction(() => callback.Invoke(result, error)); } } #endregion #region Unity methods private void LateUpdate() { try { // execute pending actions while (m_queue.Count > 0) { var action = m_queue.Dequeue(); action(); } } catch (Exception expection) { DebugLogger.LogException(expection); } } #endregion #region Private methods private void AddAction(Action action) { m_queue.Enqueue(action); } #endregion } }