Skip to content

Commit

Permalink
Keep track of DB being deleted on BackgroundDatabaseObserver
Browse files Browse the repository at this point in the history
  • Loading branch information
polqf committed Dec 12, 2023
1 parent 5ea4f83 commit baaa31e
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,18 @@ class BackgroundDatabaseObserver<Item, DTO: NSManagedObject> {
}
}

private var _deletingDatabase: Bool = false
private var deletingDatabase: Bool {
get {
queue.sync { _deletingDatabase }
}
set {
queue.async(flags: .barrier) {
self._deletingDatabase = newValue
}
}
}

deinit {
releaseNotificationObservers?()
}
Expand Down Expand Up @@ -104,7 +116,7 @@ class BackgroundDatabaseObserver<Item, DTO: NSManagedObject> {
/// Starts observing the changes in the database.
/// - Throws: An error if the fetch fails.
func startObserving() throws {
guard !isInitialized else { return }
guard !isInitialized && !deletingDatabase else { return }
isInitialized = true

do {
Expand Down Expand Up @@ -191,7 +203,7 @@ class BackgroundDatabaseObserver<Item, DTO: NSManagedObject> {

var items: [Item?] = []
items = objects.map { [weak self] in
guard $0.isValid else { return nil }
guard self?.deletingDatabase == false else { return nil }
return try? self?.itemCreator($0)
}

Expand All @@ -211,6 +223,11 @@ extension BackgroundDatabaseObserver: DatabaseObserverRemovalListener {
/// are received.
private func listenForRemoveAllDataNotifications() {
listenForRemoveAllDataNotifications(
updateIsDeleting: { [weak self] isDeleting in
self?.queue.async(flags: .barrier) {
self?._deletingDatabase = isDeleting
}
},
isBackground: true,
frc: frc,
changeAggregator: changeAggregator,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ protocol DatabaseObserverRemovalListener: AnyObject {

extension DatabaseObserverRemovalListener {
func listenForRemoveAllDataNotifications<Item, DTO: NSManagedObject>(
updateIsDeleting: @escaping (Bool) -> Void,
isBackground: Bool,
frc: NSFetchedResultsController<DTO>,
changeAggregator: ListChangeAggregator<DTO, Item>,
Expand All @@ -28,6 +29,7 @@ extension DatabaseObserverRemovalListener {
object: context,
queue: .main
) { [weak frc, weak context, weak changeAggregator] _ in
updateIsDeleting(true)
guard let frc = frc, let context = context, let changeAggregator = changeAggregator else { return }
guard let fetchResultsController = frc as? NSFetchedResultsController<NSFetchRequestResult> else { return }

Expand Down Expand Up @@ -68,6 +70,7 @@ extension DatabaseObserverRemovalListener {
object: context,
queue: .main
) { _ in
updateIsDeleting(false)
onCompletion()
}

Expand All @@ -76,4 +79,21 @@ extension DatabaseObserverRemovalListener {
notificationCenter?.removeObserver(didRemoveAllDataNotificationObserver)
}
}

func listenForRemoveAllDataNotifications<Item, DTO: NSManagedObject>(
isBackground: Bool,
frc: NSFetchedResultsController<DTO>,
changeAggregator: ListChangeAggregator<DTO, Item>,
onItemsRemoval: @escaping (@escaping () -> Void) -> Void,
onCompletion: @escaping () -> Void
) {
listenForRemoveAllDataNotifications(
updateIsDeleting: { _ in },
isBackground: isBackground,
frc: frc,
changeAggregator: changeAggregator,
onItemsRemoval: onItemsRemoval,
onCompletion: onCompletion
)
}
}

0 comments on commit baaa31e

Please sign in to comment.