Save changes to accessories immediately

This commit is contained in:
Milan Stute
2021-03-11 08:57:44 +01:00
parent df917a7e64
commit fab6cf8b55
@@ -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
}
}