From fab6cf8b55742712c55ffa600988f1b29e8e4e93 Mon Sep 17 00:00:00 2001 From: Milan Stute Date: Wed, 10 Mar 2021 17:52:20 +0100 Subject: [PATCH] Save changes to accessories immediately --- .../HaystackApp/AccessoryController.swift | 42 +++++++++---------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/OpenHaystack/OpenHaystack/HaystackApp/AccessoryController.swift b/OpenHaystack/OpenHaystack/HaystackApp/AccessoryController.swift index da28831..8496c53 100644 --- a/OpenHaystack/OpenHaystack/HaystackApp/AccessoryController.swift +++ b/OpenHaystack/OpenHaystack/HaystackApp/AccessoryController.swift @@ -13,32 +13,41 @@ class AccessoryController: ObservableObject { static let shared = AccessoryController() @Published var accessories: [Accessory] - var cancellables = [AnyCancellable]() - var saveCancellable: AnyCancellable? - - var accessoryObserver: AnyCancellable? + var selfObserver: AnyCancellable? + var listElementsObserver = [AnyCancellable]() init() { self.accessories = KeychainController.loadAccessoriesFromKeychain() + initAccessoryObserver() initObserver() } + func initAccessoryObserver() { + self.selfObserver = self.objectWillChange.sink { _ in + // objectWillChange is called before the values are actually changed, + // so we dispatch the call to save() + DispatchQueue.main.async { + self.initObserver() + try? self.save() + } + } + } + func initObserver() { + self.listElementsObserver.forEach({ + $0.cancel() + }) self.accessories.forEach({ let c = $0.objectWillChange.sink(receiveValue: { self.objectWillChange.send() }) - // Important: You have to keep the returned value allocated, // otherwise the sink subscription gets cancelled - self.cancellables.append(c) + self.listElementsObserver.append(c) }) - self.saveCancellable = self.$accessories.sink { _ in - // FIXME: accessories actually don't change - try? self.save() - } } init(accessories: [Accessory]) { self.accessories = accessories + initAccessoryObserver() initObserver() } @@ -46,10 +55,6 @@ class AccessoryController: ObservableObject { try KeychainController.storeInKeychain(accessories: self.accessories) } - func load() { - self.accessories = KeychainController.loadAccessoriesFromKeychain() - } - func updateWithDecryptedReports(devices: [FindMyDevice]) { // Assign last locations for device in FindMyController.shared.devices { @@ -76,20 +81,13 @@ class AccessoryController: ObservableObject { withAnimation { self.accessories = accessories } - try self.save() } func addAccessory(with name: String, color: Color, icon: String) throws -> Accessory { let accessory = try Accessory(name: name, color: color, iconName: icon) - - let accessories = self.accessories + [accessory] - withAnimation { - self.accessories = accessories + self.accessories.append(accessory) } - - try self.save() - return accessory } }