diff --git a/Shared/AppDelegate.swift b/Shared/AppDelegate.swift index 096ebb9..cbd4133 100644 --- a/Shared/AppDelegate.swift +++ b/Shared/AppDelegate.swift @@ -16,6 +16,7 @@ class AppDelegate: NSObject, UIApplicationDelegate { func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { // PersistenceController.shared.clearDB() + PersistenceController.shared.removeNoForDates() PersistenceController.shared.fillInMissingDates() UNUserNotificationCenter.current().delegate = self diff --git a/Shared/Persisence/Persistence.swift b/Shared/Persisence/Persistence.swift index f58ebb0..930d357 100644 --- a/Shared/Persisence/Persistence.swift +++ b/Shared/Persisence/Persistence.swift @@ -13,6 +13,8 @@ class PersistenceController { static let shared = PersistenceController.persistenceController + public var listeners = [(() -> Void)]() + private static var persistenceController: PersistenceController { return PersistenceController(inMemory: false) } @@ -77,6 +79,12 @@ class PersistenceController { init(inMemory: Bool = false) { container = setupContainer() } + + func updateListeners() { + for listener in listeners { + listener() + } + } } extension NSManagedObjectContext { diff --git a/Shared/Persisence/PersistenceADD.swift b/Shared/Persisence/PersistenceADD.swift index 0d11568..72ec602 100644 --- a/Shared/Persisence/PersistenceADD.swift +++ b/Shared/Persisence/PersistenceADD.swift @@ -25,6 +25,7 @@ extension PersistenceController { do { try viewContext.save() + updateListeners() } catch { let nsError = error as NSError fatalError("Unresolved error \(nsError), \(nsError.userInfo)") @@ -64,4 +65,18 @@ extension PersistenceController { } } } + + func removeNoForDates() { + let fetchRequest = NSFetchRequest(entityName: "MoodEntry") + fetchRequest.sortDescriptors = [NSSortDescriptor(key: "forDate", ascending: false)] + let entries = try! viewContext.fetch(fetchRequest) + + for entry in entries { + guard let _ = entry.forDate else { + viewContext.delete(entry) + try? viewContext.save() + return + } + } + } } diff --git a/Shared/Persisence/PersistenceDELETE.swift b/Shared/Persisence/PersistenceDELETE.swift index 0ddd016..9573647 100644 --- a/Shared/Persisence/PersistenceDELETE.swift +++ b/Shared/Persisence/PersistenceDELETE.swift @@ -15,6 +15,7 @@ extension PersistenceController { do { try viewContext.executeAndMergeChanges(using: deleteRequest) try viewContext.save() + updateListeners() } catch let error as NSError { fatalError("Unresolved error \(error), \(error.userInfo)") } @@ -24,6 +25,7 @@ extension PersistenceController { if let entry = PersistenceController.shared.getEntry(byDate: forDate) { viewContext.delete(entry) try! viewContext.save() + updateListeners() } } } diff --git a/Shared/Persisence/PersistenceUPDATE.swift b/Shared/Persisence/PersistenceUPDATE.swift index 12f4253..c9ab3d3 100644 --- a/Shared/Persisence/PersistenceUPDATE.swift +++ b/Shared/Persisence/PersistenceUPDATE.swift @@ -10,25 +10,12 @@ import Foundation extension PersistenceController { @discardableResult public func update(entryDate: Date, withModd mood: Mood) -> Bool { - if let entry = PersistenceController.shared.getEntry(byDate: entryDate) { - viewContext.delete(entry) - } - - do { - try PersistenceController.shared.viewContext.save() - } catch { - // Replace this implementation with code to handle the error appropriately. - // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. - let nsError = error as NSError - fatalError("Unresolved error \(nsError), \(nsError.userInfo)") - return false - } - - add(mood: mood, forDate: entryDate, entryType: .listView) - do { + if let entry = PersistenceController.shared.getEntry(byDate: entryDate) { + viewContext.delete(entry) + } + try viewContext.save() - return true } catch { // Replace this implementation with code to handle the error appropriately. // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. @@ -36,5 +23,21 @@ extension PersistenceController { fatalError("Unresolved error \(nsError), \(nsError.userInfo)") return false } + + + + do { + add(mood: mood, forDate: entryDate, entryType: .listView) + try viewContext.save() + } catch { + // Replace this implementation with code to handle the error appropriately. + // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. + let nsError = error as NSError + fatalError("Unresolved error \(nsError), \(nsError.userInfo)") + return false + } + + updateListeners() + return true } } diff --git a/Shared/views/HomeView/HomeViewTwo/MonthDetailView.swift b/Shared/views/HomeView/HomeViewTwo/MonthDetailView.swift index 90eba9f..b18d55b 100644 --- a/Shared/views/HomeView/HomeViewTwo/MonthDetailView.swift +++ b/Shared/views/HomeView/HomeViewTwo/MonthDetailView.swift @@ -72,8 +72,8 @@ struct MonthDetailView: View { deleteEnabled, selectedEntry.mood != .missing { Button(String(localized: "content_view_delete_entry"), action: { - updateEntries() PersistenceController.shared.update(entryDate: selectedEntry.forDate!, withModd: .missing) + updateEntries() showUpdateEntryAlert = false }) } diff --git a/Shared/views/HomeView/HomeViewViewModel.swift b/Shared/views/HomeView/HomeViewViewModel.swift index f29fc64..204919e 100644 --- a/Shared/views/HomeView/HomeViewViewModel.swift +++ b/Shared/views/HomeView/HomeViewViewModel.swift @@ -43,6 +43,9 @@ class HomeViewViewModel: ObservableObject { self.getGroupedData(addMonthStartWeekdayPadding: self.addMonthStartWeekdayPadding) } + PersistenceController.shared.listeners.append { [weak self] in + self?.updateData() + } updateData() }