2
2
using System . Collections ;
3
3
using System . Collections . Generic ;
4
4
using System . Collections . ObjectModel ;
5
+ using System . Linq ;
5
6
using UnityEngine . UIElements ;
6
7
7
8
// ReSharper disable once CheckNamespace
@@ -275,16 +276,18 @@ public virtual bool Remove(TKey key)
275
276
276
277
if ( ObservableUpdateFlag != ObservableUpdateFlag . UpdateOnly && _keyUpdateActions . TryGetValue ( key , out var actions ) )
277
278
{
278
- for ( var i = 0 ; i < actions . Count ; i ++ )
279
+ var listCopy = actions . ToList ( ) ;
280
+ for ( var i = 0 ; i < listCopy . Count ; i ++ )
279
281
{
280
- actions [ i ] ( key , value , default , ObservableUpdateType . Removed ) ;
282
+ listCopy [ i ] ( key , value , default , ObservableUpdateType . Removed ) ;
281
283
}
282
284
}
283
285
if ( ObservableUpdateFlag != ObservableUpdateFlag . KeyUpdateOnly )
284
286
{
285
- for ( var i = 0 ; i < _updateActions . Count ; i ++ )
287
+ var listCopy = _updateActions . ToList ( ) ;
288
+ for ( var i = 0 ; i < listCopy . Count ; i ++ )
286
289
{
287
- _updateActions [ i ] ( key , value , default , ObservableUpdateType . Removed ) ;
290
+ listCopy [ i ] ( key , value , default , ObservableUpdateType . Removed ) ;
288
291
}
289
292
}
290
293
@@ -294,31 +297,34 @@ public virtual bool Remove(TKey key)
294
297
/// <inheritdoc />
295
298
public virtual void Clear ( )
296
299
{
297
- var dictionary = new Dictionary < TKey , TValue > ( Dictionary ) ;
298
-
299
- Dictionary . Clear ( ) ;
300
-
301
300
if ( ObservableUpdateFlag != ObservableUpdateFlag . UpdateOnly )
302
301
{
303
- foreach ( var data in _keyUpdateActions )
302
+ // Create a copy in case that one of the callbacks modifies the list (Ex: removing a subscriber)
303
+ var copy = new Dictionary < TKey , IList < Action < TKey , TValue , TValue , ObservableUpdateType > > > ( _keyUpdateActions ) ;
304
+
305
+ foreach ( var data in copy )
304
306
{
305
- for ( var i = 0 ; i < data . Value . Count ; i ++ )
307
+ var listCopy = data . Value . ToList ( ) ;
308
+ for ( var i = 0 ; i < listCopy . Count ; i ++ )
306
309
{
307
- data . Value [ i ] ( data . Key , dictionary [ data . Key ] , default , ObservableUpdateType . Removed ) ;
310
+ listCopy [ i ] ( data . Key , Dictionary [ data . Key ] , default , ObservableUpdateType . Removed ) ;
308
311
}
309
312
}
310
313
}
311
314
312
315
if ( ObservableUpdateFlag != ObservableUpdateFlag . KeyUpdateOnly )
313
316
{
314
- foreach ( var data in dictionary )
317
+ foreach ( var data in Dictionary )
315
318
{
316
- for ( var i = 0 ; i < _updateActions . Count ; i ++ )
319
+ var listCopy = _updateActions . ToList ( ) ;
320
+ for ( var i = 0 ; i < listCopy . Count ; i ++ )
317
321
{
318
- _updateActions [ i ] ( data . Key , data . Value , default , ObservableUpdateType . Removed ) ;
322
+ listCopy [ i ] ( data . Key , data . Value , default , ObservableUpdateType . Removed ) ;
319
323
}
320
324
}
321
325
}
326
+
327
+ Dictionary . Clear ( ) ;
322
328
}
323
329
324
330
/// <inheritdoc />
@@ -371,6 +377,7 @@ public void StopObserving(Action<TKey, TValue, TValue, ObservableUpdateType> onU
371
377
if ( actions . Value [ i ] == onUpdate )
372
378
{
373
379
actions . Value . RemoveAt ( i ) ;
380
+ break ;
374
381
}
375
382
}
376
383
}
@@ -380,6 +387,7 @@ public void StopObserving(Action<TKey, TValue, TValue, ObservableUpdateType> onU
380
387
if ( _updateActions [ i ] == onUpdate )
381
388
{
382
389
_updateActions . RemoveAt ( i ) ;
390
+ break ;
383
391
}
384
392
}
385
393
}
0 commit comments