From 91ffd9623af6acd40a0881ec6defbd027620204b Mon Sep 17 00:00:00 2001 From: "E.Z. Hart" Date: Tue, 24 Jan 2017 15:25:44 -0700 Subject: [PATCH] Fix overeager subscription cleanup (#712) --- Xamarin.Forms.Core.UnitTests/MessagingCenterTests.cs | 18 ++++++++++++++++++ Xamarin.Forms.Core/MessagingCenter.cs | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/Xamarin.Forms.Core.UnitTests/MessagingCenterTests.cs b/Xamarin.Forms.Core.UnitTests/MessagingCenterTests.cs index ae16fce..3cd91ed 100644 --- a/Xamarin.Forms.Core.UnitTests/MessagingCenterTests.cs +++ b/Xamarin.Forms.Core.UnitTests/MessagingCenterTests.cs @@ -319,6 +319,24 @@ namespace Xamarin.Forms.Core.UnitTests Assert.True(success); // TestCallbackSource.SuccessCallback() should be invoked to make success == true } + [Test] + public void MultipleSubscribersOfTheSameClass() + { + var sub1 = new object(); + var sub2 = new object(); + + string args2 = null; + + const string message = "message"; + + MessagingCenter.Subscribe(sub1, message, (sender, args) => { }); + MessagingCenter.Subscribe(sub2, message, (sender, args) => args2 = args); + MessagingCenter.Unsubscribe(sub1, message); + + MessagingCenter.Send(this, message, "Testing"); + Assert.That(args2, Is.EqualTo("Testing"), "unsubscribing sub1 should not unsubscribe sub2"); + } + class TestSubcriber { public void SetSuccess() diff --git a/Xamarin.Forms.Core/MessagingCenter.cs b/Xamarin.Forms.Core/MessagingCenter.cs index 5e60046..b6a167d 100644 --- a/Xamarin.Forms.Core/MessagingCenter.cs +++ b/Xamarin.Forms.Core/MessagingCenter.cs @@ -205,7 +205,7 @@ namespace Xamarin.Forms var key = new Sender(message, senderType, argType); if (!s_subscriptions.ContainsKey(key)) return; - s_subscriptions[key].RemoveAll(sub => !sub.CanBeRemoved() || sub.Subscriber.Target == subscriber); + s_subscriptions[key].RemoveAll(sub => sub.CanBeRemoved() || sub.Subscriber.Target == subscriber); if (!s_subscriptions[key].Any()) s_subscriptions.Remove(key); } -- 2.7.4