CoreDataObserver.swift 986 B

1234567891011121314151617181920212223242526
  1. import Combine
  2. import CoreData
  3. import Foundation
  4. func changedObjectsOnManagedObjectContextDidSavePublisher() -> some Publisher<Set<NSManagedObject>, Never> {
  5. Foundation.NotificationCenter.default
  6. .publisher(for: NSNotification.Name.NSManagedObjectContextDidSave)
  7. .map { notification in
  8. guard let userInfo = notification.userInfo else { return Set<NSManagedObject>() }
  9. var objects = Set((userInfo[NSInsertedObjectsKey] as? Set<NSManagedObject>) ?? [])
  10. objects.formUnion((userInfo[NSUpdatedObjectsKey] as? Set<NSManagedObject>) ?? [])
  11. objects.formUnion((userInfo[NSDeletedObjectsKey] as? Set<NSManagedObject>) ?? [])
  12. return objects
  13. }
  14. }
  15. extension Publisher where Output == Set<NSManagedObject> {
  16. func filterByEntityName(_ name: String) -> some Publisher<Self.Output, Self.Failure> {
  17. filter { objects in
  18. objects.contains(where: { $0.entity.name == name })
  19. }
  20. }
  21. }