From 2477868b290961fba88d4cc49616a94343331ada Mon Sep 17 00:00:00 2001 From: "Dr.Rx" Date: Sun, 26 May 2019 10:13:18 -0400 Subject: [PATCH] Improve perfe by batching collection change updates --- .../CalculatorObservableCollection.cs | 32 ++++++++++++++++++- .../ViewModels/UnitConverterViewModel.cs | 32 +++++++++++-------- 2 files changed, 50 insertions(+), 14 deletions(-) diff --git a/src/Calculator.Shared/CalcManager/CalculatorObservableCollection.cs b/src/Calculator.Shared/CalcManager/CalculatorObservableCollection.cs index 0e02de9a..f7394847 100644 --- a/src/Calculator.Shared/CalcManager/CalculatorObservableCollection.cs +++ b/src/Calculator.Shared/CalcManager/CalculatorObservableCollection.cs @@ -1,11 +1,41 @@ using System; using System.Collections.ObjectModel; +using System.Collections.Specialized; using System.Linq; namespace CalculatorApp { public class CalculatorObservableCollection : ObservableCollection { + private int _batchUpdateCount; + + public IDisposable BatchUpdate() + { + ++_batchUpdateCount; + + return Uno.Disposables.Disposable.Create(Release); + + void Release() + { + if (--_batchUpdateCount <= 0) + { + OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); + } + } + } + + + /// + protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e) + { + if (_batchUpdateCount > 0) + { + return; + } + + base.OnCollectionChanged(e); + } + public void Append(TType item) { Add(item); @@ -16,4 +46,4 @@ namespace CalculatorApp return this[index]; } } -} \ No newline at end of file +} diff --git a/src/Calculator.Shared/ViewModels/UnitConverterViewModel.cs b/src/Calculator.Shared/ViewModels/UnitConverterViewModel.cs index 19a40527..4af46e11 100644 --- a/src/Calculator.Shared/ViewModels/UnitConverterViewModel.cs +++ b/src/Calculator.Shared/ViewModels/UnitConverterViewModel.cs @@ -950,18 +950,21 @@ namespace CalculatorApp.ViewModel void BuildUnitList(CalculatorList modelUnitList) { - m_Units.Clear(); - foreach (UCM.Unit modelUnit in modelUnitList) + using (m_Units.BatchUpdate()) { - if (!modelUnit.isWhimsical) + m_Units.Clear(); + foreach (UCM.Unit modelUnit in modelUnitList) { - m_Units.Append(new Unit(modelUnit)); + if (!modelUnit.isWhimsical) + { + m_Units.Append(new Unit(modelUnit)); + } } - } - if (m_Units.Count == 0) - { - m_Units.Append(EMPTY_UNIT); + if (m_Units.Count == 0) + { + m_Units.Append(EMPTY_UNIT); + } } } @@ -1284,11 +1287,14 @@ namespace CalculatorApp.ViewModel void InitializeView() { - CalculatorList categories = m_model.GetCategories(); - for (uint i = 0; i < categories.Size(); i++) + using (m_Categories.BatchUpdate()) { - Category category = new Category(categories[i]); - m_Categories.Append(category); + CalculatorList categories = m_model.GetCategories(); + for (uint i = 0; i < categories.Size(); i++) + { + Category category = new Category(categories[i]); + m_Categories.Append(category); + } } RestoreUserPreferences(); @@ -1585,6 +1591,7 @@ namespace CalculatorApp.ViewModel void RefreshSupplementaryResults() { lock (m_cacheMutex) + using(m_SupplementaryResults.BatchUpdate()) { m_SupplementaryResults.Clear(); @@ -1607,7 +1614,6 @@ namespace CalculatorApp.ViewModel { m_SupplementaryResults.Append(whimsicals[0]); } - } RaisePropertyChanged(SupplementaryResultsPropertyName);