CoreDataObserver.swift 1.3 KB

123456789101112131415161718192021222324252627282930313233343536
  1. import Combine
  2. import CoreData
  3. import Foundation
  4. func changedObjectsOnManagedObjectContextDidSavePublisher() -> some Publisher<Set<NSManagedObjectID>, Never> {
  5. Foundation.NotificationCenter.default
  6. .publisher(for: NSNotification.Name.NSManagedObjectContextDidSave)
  7. .map { notification in
  8. guard let userInfo = notification.userInfo else { return Set<NSManagedObjectID>() }
  9. var objectIDs = Set<NSManagedObjectID>()
  10. if let inserted = userInfo[NSInsertedObjectsKey] as? Set<NSManagedObject> {
  11. objectIDs.formUnion(inserted.map(\.objectID))
  12. }
  13. if let updated = userInfo[NSUpdatedObjectsKey] as? Set<NSManagedObject> {
  14. objectIDs.formUnion(updated.map(\.objectID))
  15. }
  16. if let deleted = userInfo[NSDeletedObjectsKey] as? Set<NSManagedObject> {
  17. objectIDs.formUnion(deleted.map(\.objectID))
  18. }
  19. return objectIDs
  20. }
  21. }
  22. extension Publisher where Output == Set<NSManagedObjectID> {
  23. func filterByEntityName(_ name: String) -> some Publisher<Self.Output, Self.Failure> {
  24. filter { objectIDs in
  25. objectIDs.contains { objectID in
  26. objectID.entity.name == name
  27. }
  28. }
  29. }
  30. }