Last active
June 28, 2021 08:45
-
-
Save pakirby1/c1327a76f8f843cf187e812dacfaadd5 to your computer and use it in GitHub Desktop.
NSFetchedResultsControllerDelegate & Combine
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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