diff --git a/src/observablecollection/src/Shared/ObservableMap.lua b/src/observablecollection/src/Shared/ObservableMap.lua index 3acf25f9c2e..98676536478 100644 --- a/src/observablecollection/src/Shared/ObservableMap.lua +++ b/src/observablecollection/src/Shared/ObservableMap.lua @@ -106,15 +106,21 @@ end function ObservableMap:_observeKeyValueChanged(packValue) return Observable.new(function(sub) - local maid = Maid.new() + local brios = {} local function handleValue(key, value) if value ~= nil then local brio = packValue(key, value) - maid[key] = brio + if brios[key] then + brios[key]:Destroy() + end + brios[key] = brio sub:Fire(brio) else - maid[key] = nil + if brios[key] then + brios[key]:Destroy() + brios[key] = nil + end end end @@ -128,7 +134,9 @@ function ObservableMap:_observeKeyValueChanged(packValue) self._maid[sub] = nil conn:Disconnect() sub:Complete() - maid:Destroy() + for _, v in brios do + v:Destroy() + end end self._maid[sub] = cleanup return cleanup diff --git a/src/observablecollection/src/Shared/ObservableSet.lua b/src/observablecollection/src/Shared/ObservableSet.lua index 367a062e3be..128c4833732 100644 --- a/src/observablecollection/src/Shared/ObservableSet.lua +++ b/src/observablecollection/src/Shared/ObservableSet.lua @@ -76,10 +76,14 @@ function ObservableSet:ObserveItemsBrio() end local maid = Maid.new() + local brios = {} local function handleItem(item) local brio = Brio.new(item) - maid[item] = brio + if brios[item] then + brios[item]:Destroy() + end + brios[item] = brio sub:Fire(brio) end @@ -89,13 +93,21 @@ function ObservableSet:ObserveItemsBrio() maid:GiveTask(self.ItemAdded:Connect(handleItem)) maid:GiveTask(self.ItemRemoved:Connect(function(item) - maid[item] = nil + -- Checking the brio exists first may be superflous? + -- I worry about strange ordering as a result of signals. + if brios[item] then + brios[item]:Destroy() + brios[item] = nil + end end)) self._maid[sub] = maid maid:GiveTask(function() self._maid[sub] = nil sub:Complete() + for _, v in brios do + v:Destroy() + end end) return maid