diff --git a/CoreStore/Observing/ListMonitor.swift b/CoreStore/Observing/ListMonitor.swift index 5017e57..ca005d4 100644 --- a/CoreStore/Observing/ListMonitor.swift +++ b/CoreStore/Observing/ListMonitor.swift @@ -316,7 +316,7 @@ public final class ListMonitor { self.removeObserver(observer) self.registerChangeNotification( - &NotificationKey.willChangeList, + &self.willChangeListKey, name: ListMonitorWillChangeListNotification, toObserver: observer, callback: { [weak observer] (monitor) -> Void in @@ -329,7 +329,7 @@ public final class ListMonitor { } ) self.registerChangeNotification( - &NotificationKey.didChangeList, + &self.didChangeListKey, name: ListMonitorDidChangeListNotification, toObserver: observer, callback: { [weak observer] (monitor) -> Void in @@ -364,7 +364,7 @@ public final class ListMonitor { self.removeObserver(observer) self.registerChangeNotification( - &NotificationKey.willChangeList, + &self.willChangeListKey, name: ListMonitorWillChangeListNotification, toObserver: observer, callback: { [weak observer] (monitor) -> Void in @@ -377,7 +377,7 @@ public final class ListMonitor { } ) self.registerChangeNotification( - &NotificationKey.didChangeList, + &self.didChangeListKey, name: ListMonitorDidChangeListNotification, toObserver: observer, callback: { [weak observer] (monitor) -> Void in @@ -391,7 +391,7 @@ public final class ListMonitor { ) self.registerObjectNotification( - &NotificationKey.didInsertObject, + &self.didInsertObjectKey, name: ListMonitorDidInsertObjectNotification, toObserver: observer, callback: { [weak observer] (monitor, object, indexPath, newIndexPath) -> Void in @@ -408,7 +408,7 @@ public final class ListMonitor { } ) self.registerObjectNotification( - &NotificationKey.didDeleteObject, + &self.didDeleteObjectKey, name: ListMonitorDidDeleteObjectNotification, toObserver: observer, callback: { [weak observer] (monitor, object, indexPath, newIndexPath) -> Void in @@ -425,7 +425,7 @@ public final class ListMonitor { } ) self.registerObjectNotification( - &NotificationKey.didUpdateObject, + &self.didUpdateObjectKey, name: ListMonitorDidUpdateObjectNotification, toObserver: observer, callback: { [weak observer] (monitor, object, indexPath, newIndexPath) -> Void in @@ -442,7 +442,7 @@ public final class ListMonitor { } ) self.registerObjectNotification( - &NotificationKey.didMoveObject, + &self.didMoveObjectKey, name: ListMonitorDidMoveObjectNotification, toObserver: observer, callback: { [weak observer] (monitor, object, indexPath, newIndexPath) -> Void in @@ -482,7 +482,7 @@ public final class ListMonitor { self.removeObserver(observer) self.registerChangeNotification( - &NotificationKey.willChangeList, + &self.willChangeListKey, name: ListMonitorWillChangeListNotification, toObserver: observer, callback: { [weak observer] (monitor) -> Void in @@ -495,7 +495,7 @@ public final class ListMonitor { } ) self.registerChangeNotification( - &NotificationKey.didChangeList, + &self.didChangeListKey, name: ListMonitorDidChangeListNotification, toObserver: observer, callback: { [weak observer] (monitor) -> Void in @@ -509,7 +509,7 @@ public final class ListMonitor { ) self.registerObjectNotification( - &NotificationKey.didInsertObject, + &self.didInsertObjectKey, name: ListMonitorDidInsertObjectNotification, toObserver: observer, callback: { [weak observer] (monitor, object, indexPath, newIndexPath) -> Void in @@ -526,7 +526,7 @@ public final class ListMonitor { } ) self.registerObjectNotification( - &NotificationKey.didDeleteObject, + &self.didDeleteObjectKey, name: ListMonitorDidDeleteObjectNotification, toObserver: observer, callback: { [weak observer] (monitor, object, indexPath, newIndexPath) -> Void in @@ -543,7 +543,7 @@ public final class ListMonitor { } ) self.registerObjectNotification( - &NotificationKey.didUpdateObject, + &self.didUpdateObjectKey, name: ListMonitorDidUpdateObjectNotification, toObserver: observer, callback: { [weak observer] (monitor, object, indexPath, newIndexPath) -> Void in @@ -560,7 +560,7 @@ public final class ListMonitor { } ) self.registerObjectNotification( - &NotificationKey.didMoveObject, + &self.didMoveObjectKey, name: ListMonitorDidMoveObjectNotification, toObserver: observer, callback: { [weak observer] (monitor, object, indexPath, newIndexPath) -> Void in @@ -579,7 +579,7 @@ public final class ListMonitor { ) self.registerSectionNotification( - &NotificationKey.didInsertSection, + &self.didInsertSectionKey, name: ListMonitorDidInsertSectionNotification, toObserver: observer, callback: { [weak observer] (monitor, sectionInfo, sectionIndex) -> Void in @@ -596,7 +596,7 @@ public final class ListMonitor { } ) self.registerSectionNotification( - &NotificationKey.didDeleteSection, + &self.didDeleteSectionKey, name: ListMonitorDidDeleteSectionNotification, toObserver: observer, callback: { [weak observer] (monitor, sectionInfo, sectionIndex) -> Void in @@ -629,16 +629,16 @@ public final class ListMonitor { ) let nilValue: AnyObject? = nil - setAssociatedRetainedObject(nilValue, forKey: &NotificationKey.willChangeList, inObject: observer) - setAssociatedRetainedObject(nilValue, forKey: &NotificationKey.didChangeList, inObject: observer) + setAssociatedRetainedObject(nilValue, forKey: &self.willChangeListKey, inObject: observer) + setAssociatedRetainedObject(nilValue, forKey: &self.didChangeListKey, inObject: observer) - setAssociatedRetainedObject(nilValue, forKey: &NotificationKey.didInsertObject, inObject: observer) - setAssociatedRetainedObject(nilValue, forKey: &NotificationKey.didDeleteObject, inObject: observer) - setAssociatedRetainedObject(nilValue, forKey: &NotificationKey.didUpdateObject, inObject: observer) - setAssociatedRetainedObject(nilValue, forKey: &NotificationKey.didMoveObject, inObject: observer) + setAssociatedRetainedObject(nilValue, forKey: &self.didInsertObjectKey, inObject: observer) + setAssociatedRetainedObject(nilValue, forKey: &self.didDeleteObjectKey, inObject: observer) + setAssociatedRetainedObject(nilValue, forKey: &self.didUpdateObjectKey, inObject: observer) + setAssociatedRetainedObject(nilValue, forKey: &self.didMoveObjectKey, inObject: observer) - setAssociatedRetainedObject(nilValue, forKey: &NotificationKey.didInsertSection, inObject: observer) - setAssociatedRetainedObject(nilValue, forKey: &NotificationKey.didDeleteSection, inObject: observer) + setAssociatedRetainedObject(nilValue, forKey: &self.didInsertSectionKey, inObject: observer) + setAssociatedRetainedObject(nilValue, forKey: &self.didDeleteSectionKey, inObject: observer) } @@ -694,6 +694,17 @@ public final class ListMonitor { private let sectionIndexTransformer: (sectionName: KeyPath?) -> String? private weak var parentStack: DataStack? + private var willChangeListKey: Void? + private var didChangeListKey: Void? + + private var didInsertObjectKey: Void? + private var didDeleteObjectKey: Void? + private var didUpdateObjectKey: Void? + private var didMoveObjectKey: Void? + + private var didInsertSectionKey: Void? + private var didDeleteSectionKey: Void? + private func registerChangeNotification(notificationKey: UnsafePointer, name: String, toObserver observer: AnyObject, callback: (monitor: ListMonitor) -> Void) { setAssociatedRetainedObject( @@ -969,17 +980,3 @@ private let UserInfoKeyNewIndexPath = "UserInfoKeyNewIndexPath" private let UserInfoKeySectionInfo = "UserInfoKeySectionInfo" private let UserInfoKeySectionIndex = "UserInfoKeySectionIndex" - -private struct NotificationKey { - - static var willChangeList: Void? - static var didChangeList: Void? - - static var didInsertObject: Void? - static var didDeleteObject: Void? - static var didUpdateObject: Void? - static var didMoveObject: Void? - - static var didInsertSection: Void? - static var didDeleteSection: Void? -} diff --git a/CoreStore/Observing/ObjectMonitor.swift b/CoreStore/Observing/ObjectMonitor.swift index 16de676..26322b5 100644 --- a/CoreStore/Observing/ObjectMonitor.swift +++ b/CoreStore/Observing/ObjectMonitor.swift @@ -81,7 +81,7 @@ public final class ObjectMonitor { self.removeObserver(observer) self.registerChangeNotification( - &NotificationKey.willChangeObject, + &self.willChangeObjectKey, name: ObjectMonitorWillChangeObjectNotification, toObserver: observer, callback: { [weak observer] (monitor) -> Void in @@ -94,7 +94,7 @@ public final class ObjectMonitor { } ) self.registerObjectNotification( - &NotificationKey.didDeleteObject, + &self.didDeleteObjectKey, name: ObjectMonitorDidDeleteObjectNotification, toObserver: observer, callback: { [weak observer] (monitor, object) -> Void in @@ -107,7 +107,7 @@ public final class ObjectMonitor { } ) self.registerObjectNotification( - &NotificationKey.didUpdateObject, + &self.didUpdateObjectKey, name: ObjectMonitorDidUpdateObjectNotification, toObserver: observer, callback: { [weak self, weak observer] (monitor, object) -> Void in @@ -154,9 +154,9 @@ public final class ObjectMonitor { ) let nilValue: AnyObject? = nil - setAssociatedRetainedObject(nilValue, forKey: &NotificationKey.willChangeObject, inObject: observer) - setAssociatedRetainedObject(nilValue, forKey: &NotificationKey.didDeleteObject, inObject: observer) - setAssociatedRetainedObject(nilValue, forKey: &NotificationKey.didUpdateObject, inObject: observer) + setAssociatedRetainedObject(nilValue, forKey: &self.willChangeObjectKey, inObject: observer) + setAssociatedRetainedObject(nilValue, forKey: &self.didDeleteObjectKey, inObject: observer) + setAssociatedRetainedObject(nilValue, forKey: &self.didUpdateObjectKey, inObject: observer) } @@ -204,6 +204,10 @@ public final class ObjectMonitor { private var lastCommittedAttributes = [String: NSObject]() private weak var parentStack: DataStack? + private var willChangeObjectKey: Void? + private var didDeleteObjectKey: Void? + private var didUpdateObjectKey: Void? + private func registerChangeNotification(notificationKey: UnsafePointer, name: String, toObserver observer: AnyObject, callback: (monitor: ObjectMonitor) -> Void) { setAssociatedRetainedObject( @@ -349,9 +353,3 @@ private let ObjectMonitorDidUpdateObjectNotification = "ObjectMonitorDidUpdateOb private let UserInfoKeyObject = "UserInfoKeyObject" -private struct NotificationKey { - - static var willChangeObject: Void? - static var didDeleteObject: Void? - static var didUpdateObject: Void? -} diff --git a/CoreStoreDemo/CoreStoreDemo/List and Object Observers Demo/ObjectObserverDemoViewController.swift b/CoreStoreDemo/CoreStoreDemo/List and Object Observers Demo/ObjectObserverDemoViewController.swift index 1a004aa..a03fb23 100644 --- a/CoreStoreDemo/CoreStoreDemo/List and Object Observers Demo/ObjectObserverDemoViewController.swift +++ b/CoreStoreDemo/CoreStoreDemo/List and Object Observers Demo/ObjectObserverDemoViewController.swift @@ -22,6 +22,11 @@ class ObjectObserverDemoViewController: UIViewController, ObjectObserver { } set { + guard self.monitor?.object != newValue else { + + return + } + if let palette = newValue { self.monitor = CoreStore.monitorObject(palette)