diff --git a/client/ios/DivKit/Variables/DivVariableStorage.swift b/client/ios/DivKit/Variables/DivVariableStorage.swift index 45ea6c16e..23f420ea1 100644 --- a/client/ios/DivKit/Variables/DivVariableStorage.swift +++ b/client/ios/DivKit/Variables/DivVariableStorage.swift @@ -19,10 +19,14 @@ public final class DivVariableStorage { /// Gets all available variables including variables from outer storage. public var allValues: DivVariables { lock.read { - (outerStorage?.allValues ?? [:]) + values + _allValues } } + private var _allValues: DivVariables { + (outerStorage?.allValues ?? [:]) + values + } + private let changeEventsPipe = SignalPipe() let changeEvents: Signal @@ -69,12 +73,13 @@ public final class DivVariableStorage { /// Updates variable value if a variable with the given name already exists. /// Does not affect outer storage. public func put(name: DivVariableName, value: DivVariableValue) { + var oldValues: DivVariables = [:] lock.write { - let oldValues = allValues + oldValues = _allValues values[name] = value - if oldValues[name] != value { - notify(ChangeEvent(changedVariables: [name], oldValues: oldValues)) - } + } + if oldValues[name] != value { + notify(ChangeEvent(changedVariables: [name], oldValues: oldValues)) } } @@ -85,21 +90,21 @@ public final class DivVariableStorage { _ variables: DivVariables, notifyObservers: Bool = true ) { + let oldValues = allValues + var changedVariables = Set() lock.write { - let oldValues = allValues values = values + variables if notifyObservers { - var changedVariables = Set() for (name, value) in variables { if oldValues[name] != value { changedVariables.insert(name) } } - if !changedVariables.isEmpty { - notify(ChangeEvent(changedVariables: changedVariables, oldValues: oldValues)) - } } } + if !changedVariables.isEmpty { + notify(ChangeEvent(changedVariables: changedVariables, oldValues: oldValues)) + } } /// Replaces all variables with new ones in single transaction. diff --git a/client/ios/DivKit/Variables/DivVariablesStorage.swift b/client/ios/DivKit/Variables/DivVariablesStorage.swift index cbdd45e5e..3208f80a7 100644 --- a/client/ios/DivKit/Variables/DivVariablesStorage.swift +++ b/client/ios/DivKit/Variables/DivVariablesStorage.swift @@ -195,6 +195,7 @@ extension DivVariablesStorage: DivVariableUpdater { name: DivVariableName, valueFactory: (DivVariableValue) -> DivVariableValue? ) { + var changeEvent: ChangeEvent? = nil lock.write { var variables = cardVariables[cardId] if let oldValue = variables?[name] { @@ -204,17 +205,18 @@ extension DivVariablesStorage: DivVariableUpdater { let oldValues = allValues variables?[name] = newValue cardVariables[cardId] = variables - notify( - ChangeEvent( - kind: .local(cardId, [name]), - oldValues: oldValues, - newValues: allValues - ) + changeEvent = ChangeEvent( + kind: .local(cardId, [name]), + oldValues: oldValues, + newValues: allValues ) } else { globalStorage.update(name: name, valueFactory: valueFactory) } } + if let changeEvent { + notify(changeEvent) + } } }