fix disconnected observers when an observer registers itself to multiple ListMonitors

This commit is contained in:
John Estropia
2015-08-28 12:09:55 +09:00
parent 21a524d725
commit 56ea14d53c
3 changed files with 50 additions and 50 deletions

View File

@@ -316,7 +316,7 @@ public final class ListMonitor<T: NSManagedObject> {
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<T: NSManagedObject> {
}
)
self.registerChangeNotification(
&NotificationKey.didChangeList,
&self.didChangeListKey,
name: ListMonitorDidChangeListNotification,
toObserver: observer,
callback: { [weak observer] (monitor) -> Void in
@@ -364,7 +364,7 @@ public final class ListMonitor<T: NSManagedObject> {
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<T: NSManagedObject> {
}
)
self.registerChangeNotification(
&NotificationKey.didChangeList,
&self.didChangeListKey,
name: ListMonitorDidChangeListNotification,
toObserver: observer,
callback: { [weak observer] (monitor) -> Void in
@@ -391,7 +391,7 @@ public final class ListMonitor<T: NSManagedObject> {
)
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<T: NSManagedObject> {
}
)
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<T: NSManagedObject> {
}
)
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<T: NSManagedObject> {
}
)
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<T: NSManagedObject> {
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<T: NSManagedObject> {
}
)
self.registerChangeNotification(
&NotificationKey.didChangeList,
&self.didChangeListKey,
name: ListMonitorDidChangeListNotification,
toObserver: observer,
callback: { [weak observer] (monitor) -> Void in
@@ -509,7 +509,7 @@ public final class ListMonitor<T: NSManagedObject> {
)
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<T: NSManagedObject> {
}
)
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<T: NSManagedObject> {
}
)
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<T: NSManagedObject> {
}
)
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<T: NSManagedObject> {
)
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<T: NSManagedObject> {
}
)
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<T: NSManagedObject> {
)
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<T: NSManagedObject> {
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<Void>, name: String, toObserver observer: AnyObject, callback: (monitor: ListMonitor<T>) -> 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?
}

View File

@@ -81,7 +81,7 @@ public final class ObjectMonitor<T: NSManagedObject> {
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<T: NSManagedObject> {
}
)
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<T: NSManagedObject> {
}
)
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<T: NSManagedObject> {
)
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<T: NSManagedObject> {
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<Void>, name: String, toObserver observer: AnyObject, callback: (monitor: ObjectMonitor<T>) -> 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?
}

View File

@@ -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)