diff options
Diffstat (limited to 'Xamarin.Forms.Core/MessagingCenter.cs')
-rw-r--r-- | Xamarin.Forms.Core/MessagingCenter.cs | 89 |
1 files changed, 20 insertions, 69 deletions
diff --git a/Xamarin.Forms.Core/MessagingCenter.cs b/Xamarin.Forms.Core/MessagingCenter.cs index d5753e1d..b6a167da 100644 --- a/Xamarin.Forms.Core/MessagingCenter.cs +++ b/Xamarin.Forms.Core/MessagingCenter.cs @@ -2,28 +2,12 @@ using System; using System.Collections.Generic; using System.Linq; using System.Reflection; +using System.Runtime.CompilerServices; namespace Xamarin.Forms { - public interface IMessagingCenter + public static class MessagingCenter { - void Send<TSender, TArgs>(TSender sender, string message, TArgs args) where TSender : class; - - void Send<TSender>(TSender sender, string message) where TSender : class; - - void Subscribe<TSender, TArgs>(object subscriber, string message, Action<TSender, TArgs> callback, TSender source = null) where TSender : class; - - void Subscribe<TSender>(object subscriber, string message, Action<TSender> callback, TSender source = null) where TSender : class; - - void Unsubscribe<TSender, TArgs>(object subscriber, string message) where TSender : class; - - void Unsubscribe<TSender>(object subscriber, string message) where TSender : class; - } - - public class MessagingCenter : IMessagingCenter - { - public static IMessagingCenter Instance { get; } = new MessagingCenter(); - class Sender : Tuple<string, Type, Type> { public Sender(string message, Type senderType, Type argType) : base(message, senderType, argType) @@ -35,8 +19,8 @@ namespace Xamarin.Forms class MaybeWeakReference { - WeakReference DelegateWeakReference { get; } - object DelegateStrongReference { get; } + WeakReference DelegateWeakReference { get; set; } + object DelegateStrongReference { get; set; } readonly bool _isStrongReference; @@ -100,16 +84,11 @@ namespace Xamarin.Forms } } - readonly Dictionary<Sender, List<Subscription>> _subscriptions = + static readonly Dictionary<Sender, List<Subscription>> s_subscriptions = new Dictionary<Sender, List<Subscription>>(); public static void Send<TSender, TArgs>(TSender sender, string message, TArgs args) where TSender : class { - Instance.Send(sender, message, args); - } - - void IMessagingCenter.Send<TSender, TArgs>(TSender sender, string message, TArgs args) - { if (sender == null) throw new ArgumentNullException(nameof(sender)); InnerSend(message, typeof(TSender), typeof(TArgs), sender, args); @@ -117,11 +96,6 @@ namespace Xamarin.Forms public static void Send<TSender>(TSender sender, string message) where TSender : class { - Instance.Send(sender, message); - } - - void IMessagingCenter.Send<TSender>(TSender sender, string message) - { if (sender == null) throw new ArgumentNullException(nameof(sender)); InnerSend(message, typeof(TSender), null, sender, null); @@ -129,11 +103,6 @@ namespace Xamarin.Forms public static void Subscribe<TSender, TArgs>(object subscriber, string message, Action<TSender, TArgs> callback, TSender source = null) where TSender : class { - Instance.Subscribe(subscriber, message, callback, source); - } - - void IMessagingCenter.Subscribe<TSender, TArgs>(object subscriber, string message, Action<TSender, TArgs> callback, TSender source) - { if (subscriber == null) throw new ArgumentNullException(nameof(subscriber)); if (callback == null) @@ -152,11 +121,6 @@ namespace Xamarin.Forms public static void Subscribe<TSender>(object subscriber, string message, Action<TSender> callback, TSender source = null) where TSender : class { - Instance.Subscribe(subscriber, message, callback, source); - } - - void IMessagingCenter.Subscribe<TSender>(object subscriber, string message, Action<TSender> callback, TSender source) - { if (subscriber == null) throw new ArgumentNullException(nameof(subscriber)); if (callback == null) @@ -175,32 +139,27 @@ namespace Xamarin.Forms public static void Unsubscribe<TSender, TArgs>(object subscriber, string message) where TSender : class { - Instance.Unsubscribe<TSender, TArgs>(subscriber, message); - } - - void IMessagingCenter.Unsubscribe<TSender, TArgs>(object subscriber, string message) - { InnerUnsubscribe(message, typeof(TSender), typeof(TArgs), subscriber); } public static void Unsubscribe<TSender>(object subscriber, string message) where TSender : class { - Instance.Unsubscribe<TSender>(subscriber, message); + InnerUnsubscribe(message, typeof(TSender), null, subscriber); } - void IMessagingCenter.Unsubscribe<TSender>(object subscriber, string message) + internal static void ClearSubscribers() { - InnerUnsubscribe(message, typeof(TSender), null, subscriber); + s_subscriptions.Clear(); } - void InnerSend(string message, Type senderType, Type argType, object sender, object args) + static void InnerSend(string message, Type senderType, Type argType, object sender, object args) { if (message == null) throw new ArgumentNullException(nameof(message)); var key = new Sender(message, senderType, argType); - if (!_subscriptions.ContainsKey(key)) + if (!s_subscriptions.ContainsKey(key)) return; - List<Subscription> subcriptions = _subscriptions[key]; + List<Subscription> subcriptions = s_subscriptions[key]; if (subcriptions == null || !subcriptions.Any()) return; // should not be reachable @@ -219,24 +178,24 @@ namespace Xamarin.Forms } } - void InnerSubscribe(object subscriber, string message, Type senderType, Type argType, object target, MethodInfo methodInfo, Filter filter) + static void InnerSubscribe(object subscriber, string message, Type senderType, Type argType, object target, MethodInfo methodInfo, Filter filter) { if (message == null) throw new ArgumentNullException(nameof(message)); var key = new Sender(message, senderType, argType); var value = new Subscription(subscriber, target, methodInfo, filter); - if (_subscriptions.ContainsKey(key)) + if (s_subscriptions.ContainsKey(key)) { - _subscriptions[key].Add(value); + s_subscriptions[key].Add(value); } else { var list = new List<Subscription> { value }; - _subscriptions[key] = list; + s_subscriptions[key] = list; } } - void InnerUnsubscribe(string message, Type senderType, Type argType, object subscriber) + static void InnerUnsubscribe(string message, Type senderType, Type argType, object subscriber) { if (subscriber == null) throw new ArgumentNullException(nameof(subscriber)); @@ -244,19 +203,11 @@ namespace Xamarin.Forms throw new ArgumentNullException(nameof(message)); var key = new Sender(message, senderType, argType); - if (!_subscriptions.ContainsKey(key)) + if (!s_subscriptions.ContainsKey(key)) return; - _subscriptions[key].RemoveAll(sub => sub.CanBeRemoved() || sub.Subscriber.Target == subscriber); - if (!_subscriptions[key].Any()) - _subscriptions.Remove(key); - } - - // This is a bit gross; it only exists to support the unit tests in PageTests - // because the implementations of ActionSheet, Alert, and IsBusy are all very - // tightly coupled to the MessagingCenter singleton - internal static void ClearSubscribers() - { - (Instance as MessagingCenter)?._subscriptions.Clear(); + s_subscriptions[key].RemoveAll(sub => sub.CanBeRemoved() || sub.Subscriber.Target == subscriber); + if (!s_subscriptions[key].Any()) + s_subscriptions.Remove(key); } } }
\ No newline at end of file |