mirror of
https://github.com/JohnEstropia/CoreStore.git
synced 2026-03-28 12:21:51 +01:00
fix disconnected observers when an observer registers itself to multiple ListMonitors
This commit is contained in:
@@ -316,7 +316,7 @@ public final class ListMonitor<T: NSManagedObject> {
|
|||||||
self.removeObserver(observer)
|
self.removeObserver(observer)
|
||||||
|
|
||||||
self.registerChangeNotification(
|
self.registerChangeNotification(
|
||||||
&NotificationKey.willChangeList,
|
&self.willChangeListKey,
|
||||||
name: ListMonitorWillChangeListNotification,
|
name: ListMonitorWillChangeListNotification,
|
||||||
toObserver: observer,
|
toObserver: observer,
|
||||||
callback: { [weak observer] (monitor) -> Void in
|
callback: { [weak observer] (monitor) -> Void in
|
||||||
@@ -329,7 +329,7 @@ public final class ListMonitor<T: NSManagedObject> {
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
self.registerChangeNotification(
|
self.registerChangeNotification(
|
||||||
&NotificationKey.didChangeList,
|
&self.didChangeListKey,
|
||||||
name: ListMonitorDidChangeListNotification,
|
name: ListMonitorDidChangeListNotification,
|
||||||
toObserver: observer,
|
toObserver: observer,
|
||||||
callback: { [weak observer] (monitor) -> Void in
|
callback: { [weak observer] (monitor) -> Void in
|
||||||
@@ -364,7 +364,7 @@ public final class ListMonitor<T: NSManagedObject> {
|
|||||||
self.removeObserver(observer)
|
self.removeObserver(observer)
|
||||||
|
|
||||||
self.registerChangeNotification(
|
self.registerChangeNotification(
|
||||||
&NotificationKey.willChangeList,
|
&self.willChangeListKey,
|
||||||
name: ListMonitorWillChangeListNotification,
|
name: ListMonitorWillChangeListNotification,
|
||||||
toObserver: observer,
|
toObserver: observer,
|
||||||
callback: { [weak observer] (monitor) -> Void in
|
callback: { [weak observer] (monitor) -> Void in
|
||||||
@@ -377,7 +377,7 @@ public final class ListMonitor<T: NSManagedObject> {
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
self.registerChangeNotification(
|
self.registerChangeNotification(
|
||||||
&NotificationKey.didChangeList,
|
&self.didChangeListKey,
|
||||||
name: ListMonitorDidChangeListNotification,
|
name: ListMonitorDidChangeListNotification,
|
||||||
toObserver: observer,
|
toObserver: observer,
|
||||||
callback: { [weak observer] (monitor) -> Void in
|
callback: { [weak observer] (monitor) -> Void in
|
||||||
@@ -391,7 +391,7 @@ public final class ListMonitor<T: NSManagedObject> {
|
|||||||
)
|
)
|
||||||
|
|
||||||
self.registerObjectNotification(
|
self.registerObjectNotification(
|
||||||
&NotificationKey.didInsertObject,
|
&self.didInsertObjectKey,
|
||||||
name: ListMonitorDidInsertObjectNotification,
|
name: ListMonitorDidInsertObjectNotification,
|
||||||
toObserver: observer,
|
toObserver: observer,
|
||||||
callback: { [weak observer] (monitor, object, indexPath, newIndexPath) -> Void in
|
callback: { [weak observer] (monitor, object, indexPath, newIndexPath) -> Void in
|
||||||
@@ -408,7 +408,7 @@ public final class ListMonitor<T: NSManagedObject> {
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
self.registerObjectNotification(
|
self.registerObjectNotification(
|
||||||
&NotificationKey.didDeleteObject,
|
&self.didDeleteObjectKey,
|
||||||
name: ListMonitorDidDeleteObjectNotification,
|
name: ListMonitorDidDeleteObjectNotification,
|
||||||
toObserver: observer,
|
toObserver: observer,
|
||||||
callback: { [weak observer] (monitor, object, indexPath, newIndexPath) -> Void in
|
callback: { [weak observer] (monitor, object, indexPath, newIndexPath) -> Void in
|
||||||
@@ -425,7 +425,7 @@ public final class ListMonitor<T: NSManagedObject> {
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
self.registerObjectNotification(
|
self.registerObjectNotification(
|
||||||
&NotificationKey.didUpdateObject,
|
&self.didUpdateObjectKey,
|
||||||
name: ListMonitorDidUpdateObjectNotification,
|
name: ListMonitorDidUpdateObjectNotification,
|
||||||
toObserver: observer,
|
toObserver: observer,
|
||||||
callback: { [weak observer] (monitor, object, indexPath, newIndexPath) -> Void in
|
callback: { [weak observer] (monitor, object, indexPath, newIndexPath) -> Void in
|
||||||
@@ -442,7 +442,7 @@ public final class ListMonitor<T: NSManagedObject> {
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
self.registerObjectNotification(
|
self.registerObjectNotification(
|
||||||
&NotificationKey.didMoveObject,
|
&self.didMoveObjectKey,
|
||||||
name: ListMonitorDidMoveObjectNotification,
|
name: ListMonitorDidMoveObjectNotification,
|
||||||
toObserver: observer,
|
toObserver: observer,
|
||||||
callback: { [weak observer] (monitor, object, indexPath, newIndexPath) -> Void in
|
callback: { [weak observer] (monitor, object, indexPath, newIndexPath) -> Void in
|
||||||
@@ -482,7 +482,7 @@ public final class ListMonitor<T: NSManagedObject> {
|
|||||||
self.removeObserver(observer)
|
self.removeObserver(observer)
|
||||||
|
|
||||||
self.registerChangeNotification(
|
self.registerChangeNotification(
|
||||||
&NotificationKey.willChangeList,
|
&self.willChangeListKey,
|
||||||
name: ListMonitorWillChangeListNotification,
|
name: ListMonitorWillChangeListNotification,
|
||||||
toObserver: observer,
|
toObserver: observer,
|
||||||
callback: { [weak observer] (monitor) -> Void in
|
callback: { [weak observer] (monitor) -> Void in
|
||||||
@@ -495,7 +495,7 @@ public final class ListMonitor<T: NSManagedObject> {
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
self.registerChangeNotification(
|
self.registerChangeNotification(
|
||||||
&NotificationKey.didChangeList,
|
&self.didChangeListKey,
|
||||||
name: ListMonitorDidChangeListNotification,
|
name: ListMonitorDidChangeListNotification,
|
||||||
toObserver: observer,
|
toObserver: observer,
|
||||||
callback: { [weak observer] (monitor) -> Void in
|
callback: { [weak observer] (monitor) -> Void in
|
||||||
@@ -509,7 +509,7 @@ public final class ListMonitor<T: NSManagedObject> {
|
|||||||
)
|
)
|
||||||
|
|
||||||
self.registerObjectNotification(
|
self.registerObjectNotification(
|
||||||
&NotificationKey.didInsertObject,
|
&self.didInsertObjectKey,
|
||||||
name: ListMonitorDidInsertObjectNotification,
|
name: ListMonitorDidInsertObjectNotification,
|
||||||
toObserver: observer,
|
toObserver: observer,
|
||||||
callback: { [weak observer] (monitor, object, indexPath, newIndexPath) -> Void in
|
callback: { [weak observer] (monitor, object, indexPath, newIndexPath) -> Void in
|
||||||
@@ -526,7 +526,7 @@ public final class ListMonitor<T: NSManagedObject> {
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
self.registerObjectNotification(
|
self.registerObjectNotification(
|
||||||
&NotificationKey.didDeleteObject,
|
&self.didDeleteObjectKey,
|
||||||
name: ListMonitorDidDeleteObjectNotification,
|
name: ListMonitorDidDeleteObjectNotification,
|
||||||
toObserver: observer,
|
toObserver: observer,
|
||||||
callback: { [weak observer] (monitor, object, indexPath, newIndexPath) -> Void in
|
callback: { [weak observer] (monitor, object, indexPath, newIndexPath) -> Void in
|
||||||
@@ -543,7 +543,7 @@ public final class ListMonitor<T: NSManagedObject> {
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
self.registerObjectNotification(
|
self.registerObjectNotification(
|
||||||
&NotificationKey.didUpdateObject,
|
&self.didUpdateObjectKey,
|
||||||
name: ListMonitorDidUpdateObjectNotification,
|
name: ListMonitorDidUpdateObjectNotification,
|
||||||
toObserver: observer,
|
toObserver: observer,
|
||||||
callback: { [weak observer] (monitor, object, indexPath, newIndexPath) -> Void in
|
callback: { [weak observer] (monitor, object, indexPath, newIndexPath) -> Void in
|
||||||
@@ -560,7 +560,7 @@ public final class ListMonitor<T: NSManagedObject> {
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
self.registerObjectNotification(
|
self.registerObjectNotification(
|
||||||
&NotificationKey.didMoveObject,
|
&self.didMoveObjectKey,
|
||||||
name: ListMonitorDidMoveObjectNotification,
|
name: ListMonitorDidMoveObjectNotification,
|
||||||
toObserver: observer,
|
toObserver: observer,
|
||||||
callback: { [weak observer] (monitor, object, indexPath, newIndexPath) -> Void in
|
callback: { [weak observer] (monitor, object, indexPath, newIndexPath) -> Void in
|
||||||
@@ -579,7 +579,7 @@ public final class ListMonitor<T: NSManagedObject> {
|
|||||||
)
|
)
|
||||||
|
|
||||||
self.registerSectionNotification(
|
self.registerSectionNotification(
|
||||||
&NotificationKey.didInsertSection,
|
&self.didInsertSectionKey,
|
||||||
name: ListMonitorDidInsertSectionNotification,
|
name: ListMonitorDidInsertSectionNotification,
|
||||||
toObserver: observer,
|
toObserver: observer,
|
||||||
callback: { [weak observer] (monitor, sectionInfo, sectionIndex) -> Void in
|
callback: { [weak observer] (monitor, sectionInfo, sectionIndex) -> Void in
|
||||||
@@ -596,7 +596,7 @@ public final class ListMonitor<T: NSManagedObject> {
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
self.registerSectionNotification(
|
self.registerSectionNotification(
|
||||||
&NotificationKey.didDeleteSection,
|
&self.didDeleteSectionKey,
|
||||||
name: ListMonitorDidDeleteSectionNotification,
|
name: ListMonitorDidDeleteSectionNotification,
|
||||||
toObserver: observer,
|
toObserver: observer,
|
||||||
callback: { [weak observer] (monitor, sectionInfo, sectionIndex) -> Void in
|
callback: { [weak observer] (monitor, sectionInfo, sectionIndex) -> Void in
|
||||||
@@ -629,16 +629,16 @@ public final class ListMonitor<T: NSManagedObject> {
|
|||||||
)
|
)
|
||||||
|
|
||||||
let nilValue: AnyObject? = nil
|
let nilValue: AnyObject? = nil
|
||||||
setAssociatedRetainedObject(nilValue, forKey: &NotificationKey.willChangeList, inObject: observer)
|
setAssociatedRetainedObject(nilValue, forKey: &self.willChangeListKey, inObject: observer)
|
||||||
setAssociatedRetainedObject(nilValue, forKey: &NotificationKey.didChangeList, inObject: observer)
|
setAssociatedRetainedObject(nilValue, forKey: &self.didChangeListKey, inObject: observer)
|
||||||
|
|
||||||
setAssociatedRetainedObject(nilValue, forKey: &NotificationKey.didInsertObject, inObject: observer)
|
setAssociatedRetainedObject(nilValue, forKey: &self.didInsertObjectKey, inObject: observer)
|
||||||
setAssociatedRetainedObject(nilValue, forKey: &NotificationKey.didDeleteObject, inObject: observer)
|
setAssociatedRetainedObject(nilValue, forKey: &self.didDeleteObjectKey, inObject: observer)
|
||||||
setAssociatedRetainedObject(nilValue, forKey: &NotificationKey.didUpdateObject, inObject: observer)
|
setAssociatedRetainedObject(nilValue, forKey: &self.didUpdateObjectKey, inObject: observer)
|
||||||
setAssociatedRetainedObject(nilValue, forKey: &NotificationKey.didMoveObject, inObject: observer)
|
setAssociatedRetainedObject(nilValue, forKey: &self.didMoveObjectKey, inObject: observer)
|
||||||
|
|
||||||
setAssociatedRetainedObject(nilValue, forKey: &NotificationKey.didInsertSection, inObject: observer)
|
setAssociatedRetainedObject(nilValue, forKey: &self.didInsertSectionKey, inObject: observer)
|
||||||
setAssociatedRetainedObject(nilValue, forKey: &NotificationKey.didDeleteSection, 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 let sectionIndexTransformer: (sectionName: KeyPath?) -> String?
|
||||||
private weak var parentStack: DataStack?
|
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) {
|
private func registerChangeNotification(notificationKey: UnsafePointer<Void>, name: String, toObserver observer: AnyObject, callback: (monitor: ListMonitor<T>) -> Void) {
|
||||||
|
|
||||||
setAssociatedRetainedObject(
|
setAssociatedRetainedObject(
|
||||||
@@ -969,17 +980,3 @@ private let UserInfoKeyNewIndexPath = "UserInfoKeyNewIndexPath"
|
|||||||
|
|
||||||
private let UserInfoKeySectionInfo = "UserInfoKeySectionInfo"
|
private let UserInfoKeySectionInfo = "UserInfoKeySectionInfo"
|
||||||
private let UserInfoKeySectionIndex = "UserInfoKeySectionIndex"
|
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?
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ public final class ObjectMonitor<T: NSManagedObject> {
|
|||||||
self.removeObserver(observer)
|
self.removeObserver(observer)
|
||||||
|
|
||||||
self.registerChangeNotification(
|
self.registerChangeNotification(
|
||||||
&NotificationKey.willChangeObject,
|
&self.willChangeObjectKey,
|
||||||
name: ObjectMonitorWillChangeObjectNotification,
|
name: ObjectMonitorWillChangeObjectNotification,
|
||||||
toObserver: observer,
|
toObserver: observer,
|
||||||
callback: { [weak observer] (monitor) -> Void in
|
callback: { [weak observer] (monitor) -> Void in
|
||||||
@@ -94,7 +94,7 @@ public final class ObjectMonitor<T: NSManagedObject> {
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
self.registerObjectNotification(
|
self.registerObjectNotification(
|
||||||
&NotificationKey.didDeleteObject,
|
&self.didDeleteObjectKey,
|
||||||
name: ObjectMonitorDidDeleteObjectNotification,
|
name: ObjectMonitorDidDeleteObjectNotification,
|
||||||
toObserver: observer,
|
toObserver: observer,
|
||||||
callback: { [weak observer] (monitor, object) -> Void in
|
callback: { [weak observer] (monitor, object) -> Void in
|
||||||
@@ -107,7 +107,7 @@ public final class ObjectMonitor<T: NSManagedObject> {
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
self.registerObjectNotification(
|
self.registerObjectNotification(
|
||||||
&NotificationKey.didUpdateObject,
|
&self.didUpdateObjectKey,
|
||||||
name: ObjectMonitorDidUpdateObjectNotification,
|
name: ObjectMonitorDidUpdateObjectNotification,
|
||||||
toObserver: observer,
|
toObserver: observer,
|
||||||
callback: { [weak self, weak observer] (monitor, object) -> Void in
|
callback: { [weak self, weak observer] (monitor, object) -> Void in
|
||||||
@@ -154,9 +154,9 @@ public final class ObjectMonitor<T: NSManagedObject> {
|
|||||||
)
|
)
|
||||||
|
|
||||||
let nilValue: AnyObject? = nil
|
let nilValue: AnyObject? = nil
|
||||||
setAssociatedRetainedObject(nilValue, forKey: &NotificationKey.willChangeObject, inObject: observer)
|
setAssociatedRetainedObject(nilValue, forKey: &self.willChangeObjectKey, inObject: observer)
|
||||||
setAssociatedRetainedObject(nilValue, forKey: &NotificationKey.didDeleteObject, inObject: observer)
|
setAssociatedRetainedObject(nilValue, forKey: &self.didDeleteObjectKey, inObject: observer)
|
||||||
setAssociatedRetainedObject(nilValue, forKey: &NotificationKey.didUpdateObject, 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 var lastCommittedAttributes = [String: NSObject]()
|
||||||
private weak var parentStack: DataStack?
|
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) {
|
private func registerChangeNotification(notificationKey: UnsafePointer<Void>, name: String, toObserver observer: AnyObject, callback: (monitor: ObjectMonitor<T>) -> Void) {
|
||||||
|
|
||||||
setAssociatedRetainedObject(
|
setAssociatedRetainedObject(
|
||||||
@@ -349,9 +353,3 @@ private let ObjectMonitorDidUpdateObjectNotification = "ObjectMonitorDidUpdateOb
|
|||||||
|
|
||||||
private let UserInfoKeyObject = "UserInfoKeyObject"
|
private let UserInfoKeyObject = "UserInfoKeyObject"
|
||||||
|
|
||||||
private struct NotificationKey {
|
|
||||||
|
|
||||||
static var willChangeObject: Void?
|
|
||||||
static var didDeleteObject: Void?
|
|
||||||
static var didUpdateObject: Void?
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -22,6 +22,11 @@ class ObjectObserverDemoViewController: UIViewController, ObjectObserver {
|
|||||||
}
|
}
|
||||||
set {
|
set {
|
||||||
|
|
||||||
|
guard self.monitor?.object != newValue else {
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if let palette = newValue {
|
if let palette = newValue {
|
||||||
|
|
||||||
self.monitor = CoreStore.monitorObject(palette)
|
self.monitor = CoreStore.monitorObject(palette)
|
||||||
|
|||||||
Reference in New Issue
Block a user