Skip to content

Commit

Permalink
Improve API to track if database is being removed
Browse files Browse the repository at this point in the history
  • Loading branch information
polqf committed Dec 13, 2023
1 parent baaa31e commit 6e81f13
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 29 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -39,26 +39,14 @@ class BackgroundDatabaseObserver<Item, DTO: NSManagedObject> {

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

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

deinit {
Expand Down Expand Up @@ -116,7 +104,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 && !deletingDatabase else { return }
guard !isInitialized && !isDeletingDatabase else { return }
isInitialized = true

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

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

Expand All @@ -223,14 +211,14 @@ 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,
onStart: { [weak self] in
self?.queue.async(flags: .barrier) {
self?._isDeletingDatabase = true
}
},
onItemsRemoval: { [weak self] completion in
self?.queue.async(flags: .barrier) {
self?._items = []
Expand All @@ -242,6 +230,7 @@ extension BackgroundDatabaseObserver: DatabaseObserverRemovalListener {
onCompletion: { [weak self] in
guard let self = self else { return }
self.queue.async(flags: .barrier) {
self._isDeletingDatabase = false
self._isInitialized = false

DispatchQueue.main.async {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@ protocol DatabaseObserverRemovalListener: AnyObject {

extension DatabaseObserverRemovalListener {
func listenForRemoveAllDataNotifications<Item, DTO: NSManagedObject>(
updateIsDeleting: @escaping (Bool) -> Void,
isBackground: Bool,
frc: NSFetchedResultsController<DTO>,
changeAggregator: ListChangeAggregator<DTO, Item>,
onStart: @escaping () -> Void,
onItemsRemoval: @escaping (@escaping () -> Void) -> Void,
onCompletion: @escaping () -> Void
) {
Expand All @@ -29,9 +29,9 @@ 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 }
onStart()

let removeItems = {
// Simulate ChangeObserver callbacks like all data are being removed
Expand Down Expand Up @@ -70,7 +70,6 @@ extension DatabaseObserverRemovalListener {
object: context,
queue: .main
) { _ in
updateIsDeleting(false)
onCompletion()
}

Expand All @@ -88,10 +87,10 @@ extension DatabaseObserverRemovalListener {
onCompletion: @escaping () -> Void
) {
listenForRemoveAllDataNotifications(
updateIsDeleting: { _ in },
isBackground: isBackground,
frc: frc,
changeAggregator: changeAggregator,
onStart: {},
onItemsRemoval: onItemsRemoval,
onCompletion: onCompletion
)
Expand Down

0 comments on commit 6e81f13

Please sign in to comment.