Skip to content

Instantly share code, notes, and snippets.

@glebov21
Created February 21, 2018 15:57
Show Gist options
  • Save glebov21/a7ce5789ad1e86df6232664001f9d950 to your computer and use it in GitHub Desktop.
Save glebov21/a7ce5789ad1e86df6232664001f9d950 to your computer and use it in GitHub Desktop.
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
public static class ChangeNotifier
{
private static Dictionary<Type, List<WeakReference>> listeners = new Dictionary<Type, List<WeakReference>>();
private static List<WeakReference> checkersToRemove = new List<WeakReference>();
public static void Notify(Type tableType)
{
if (listeners.ContainsKey(tableType))
{
checkersToRemove.Clear();
var listenersOfType = listeners[tableType];
for (int i = 0; i < listenersOfType.Count; i++)
{
var weak = listenersOfType[i];
ChangeChecker cc = (ChangeChecker)weak.Target;
if (cc == null || !weak.IsAlive)
{
checkersToRemove.Add(weak);
}
else
{
cc.IsUpdated = true;
}
}
foreach (var checkerToRemove in checkersToRemove)
listenersOfType.Remove(checkerToRemove);
}
}
public static void AddListener(ChangeChecker checker, Type tableType)
{
WeakReference wr = new WeakReference(checker);
if (listeners.ContainsKey(tableType))
listeners[tableType].Add(wr);
else
{
List<WeakReference> changings = new List<WeakReference> { wr };
listeners.Add(tableType, changings);
}
}
public static void AddListener(ChangeChecker checker, params Type[] tableTypes)
{
foreach (Type tableType in tableTypes)
{
AddListener(checker, tableType);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment