Files
Pulse/Sources/PulseUI/Helpers/ManagedObjectsCountObserver.swift
T
2024-04-13 13:57:23 -04:00

39 lines
1.3 KiB
Swift

// The MIT License (MIT)
//
// Copyright (c) 2020-2024 Alexander Grebenyuk (github.com/kean).
import CoreData
final class ManagedObjectsCountObserver: NSObject, ObservableObject, NSFetchedResultsControllerDelegate {
let controller: NSFetchedResultsController<NSManagedObject>
@Published private(set) var count = 0
init<T: NSManagedObject>(entity: T.Type, context: NSManagedObjectContext, sortDescriptior: NSSortDescriptor) {
let request = NSFetchRequest<NSManagedObject>(entityName: "\(T.self)")
request.fetchBatchSize = 1
request.sortDescriptors = [sortDescriptior]
self.controller = NSFetchedResultsController<NSManagedObject>(fetchRequest: request, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
super.init()
self.controller.delegate = self
self.refresh()
}
func setPredicate(_ predicate: NSPredicate?) {
controller.fetchRequest.predicate = predicate
refresh()
}
func refresh() {
try? controller.performFetch()
self.count = controller.fetchedObjects?.count ?? 0
}
func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
self.count = controller.fetchedObjects?.count ?? 0
}
}