public void Unsubscribe <T>(ITinySubscriber <T> subscriber) { lock (subscribersMap) { if (!subscribersMap.TryGetValue(typeof(T), out var subscribers)) { return; } foreach (var weakReference in subscribers.ToArray()) { if (weakReference.TryGetTarget(out var tinySubscriber)) { if (tinySubscriber.Equals(subscriber)) { subscribers.Remove(weakReference); Debug.WriteLine($"remove subscriber type={typeof(T)} total={subscribers.Count}"); } } } if (!subscribers.Any()) { subscribersMap.Remove(typeof(T)); Debug.WriteLine($"remove empty subscribers list type={typeof(T)}"); } } }
public void Subscribe <T>(ITinySubscriber <T> subscriber) { lock (subscribersMap) { if (!subscribersMap.TryGetValue(typeof(T), out var subscribers)) { subscribers = new List <WeakReference <ITinySubscriber> >(); subscribersMap.Add(typeof(T), subscribers); } var weakSubscriber = new WeakReference <ITinySubscriber>(subscriber); subscribers.Add(weakSubscriber); Debug.WriteLine($"add subscriber type={typeof(T)} total={subscribers.Count}"); } }