Skip to content

Instantly share code, notes, and snippets.

@pakirby1
Last active June 28, 2021 08:45
Show Gist options
  • Save pakirby1/c1327a76f8f843cf187e812dacfaadd5 to your computer and use it in GitHub Desktop.
Save pakirby1/c1327a76f8f843cf187e812dacfaadd5 to your computer and use it in GitHub Desktop.
NSFetchedResultsControllerDelegate & Combine
import Foundation
import CoreData
import Combine
import SwiftUI
class BindableFetchedResultsController<T: NSManagedObject>: NSObject, NSFetchedResultsControllerDelegate, ObservableObject {
let fetchedResultsController: NSFetchedResultsController<T>
// Publisher. clients should reference to get updates
@Published var fetchedObjects: [T]
private var cancellableSet = Set<AnyCancellable>()
private func updateFetchedObjects() {
self.fetchedObjects = fetchedResultsController.fetchedObjects ?? []
}
init(
fetchRequest: NSFetchRequest<T>,
managedObjectContext: NSManagedObjectContext
) {
fetchedResultsController =
NSFetchedResultsController(fetchRequest: fetchRequest,
managedObjectContext: managedObjectContext,
sectionNameKeyPath: nil,
cacheName: nil)
do {
try fetchedResultsController.performFetch()
} catch {
NSLog("Error fetching objects: \(error)")
}
fetchedObjects = fetchedResultsController.fetchedObjects ?? []
super.init()
fetchedResultsController.delegate = self
// Just for logging
$fetchedObjects
.print("PAK: BindableFetchedResultsController.fetchedObjects")
.sink{ fetchedObjects in
print("PAK: BindableFetchedResultsController.fetchedObjects event \(Date())")
print("PAK: BindableFetchedResultsController.fetchedObjects count: \(fetchedObjects.count)")
}
.store(in: &cancellableSet)
}
func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
updateFetchedObjects()
}
func fetch() -> AnyPublisher<[T], Never> {
do {
try fetchedResultsController.performFetch()
} catch {
NSLog("Error fetching objects: \(error)")
}
fetchedObjects = fetchedResultsController.fetchedObjects ?? []
return $fetchedObjects.eraseToAnyPublisher()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment