diff --git a/Sources/ObjectMonitor.swift b/Sources/ObjectMonitor.swift index 8faac46..938cd0d 100644 --- a/Sources/ObjectMonitor.swift +++ b/Sources/ObjectMonitor.swift @@ -40,12 +40,7 @@ import CoreData Observers registered via `addObserver(_:)` are not retained. `ObjectMonitor` only keeps a `weak` reference to all observers, thus keeping itself free from retain-cycles. */ @available(macOS 10.12, *) -public final class ObjectMonitor: Equatable { - - /** - The object type represented by this `ObjectMonitor` - */ - public typealias ObjectType = O +public final class ObjectMonitor: Hashable, ObjectRepresentation { /** Returns the `DynamicObject` instance being observed, or `nil` if the object was already deleted. @@ -156,6 +151,51 @@ public final class ObjectMonitor: Equatable { } + // MARK: AnyObjectRepresentation + + public func objectID() -> O.ObjectID { + + return self.id + } + + public func cs_dataStack() -> DataStack? { + + return self.context.parentStack + } + + + // MARK: ObjectRepresentation + + public typealias ObjectType = O + + public func asPublisher(in dataStack: DataStack) -> ObjectPublisher { + + return dataStack.unsafeContext().objectPublisher(objectID: self.id) + } + + public func asReadOnly(in dataStack: DataStack) -> O? { + + return dataStack.unsafeContext().fetchExisting(self.id) + } + + public func asEditable(in transaction: BaseDataTransaction) -> O? { + + return transaction.unsafeContext().fetchExisting(self.id) + } + + public func asSnapshot(in dataStack: DataStack) -> ObjectSnapshot? { + + let context = dataStack.unsafeContext() + return ObjectSnapshot(objectID: self.id, context: context) + } + + public func asSnapshot(in transaction: BaseDataTransaction) -> ObjectSnapshot? { + + let context = transaction.unsafeContext() + return ObjectSnapshot(objectID: self.id, context: context) + } + + // MARK: Internal internal init(objectID: O.ObjectID, context: NSManagedObjectContext) { diff --git a/Sources/ObjectPublisher.swift b/Sources/ObjectPublisher.swift index c3a1311..2e6380e 100644 --- a/Sources/ObjectPublisher.swift +++ b/Sources/ObjectPublisher.swift @@ -125,15 +125,23 @@ public final class ObjectPublisher: ObjectRepresentation, Hash } - // MARK: ObjectRepresentation - - public typealias ObjectType = O + // MARK: AnyObjectRepresentation public func objectID() -> O.ObjectID { return self.id } + public func cs_dataStack() -> DataStack? { + + return self.context.parentStack + } + + + // MARK: ObjectRepresentation + + public typealias ObjectType = O + public func asPublisher(in dataStack: DataStack) -> ObjectPublisher { let context = dataStack.unsafeContext() @@ -173,11 +181,6 @@ public final class ObjectPublisher: ObjectRepresentation, Hash } return ObjectSnapshot(objectID: self.id, context: context) } - - public func cs_dataStack() -> DataStack? { - - return self.context.parentStack - } // MARK: Equatable diff --git a/Sources/ObjectRepresentation.swift b/Sources/ObjectRepresentation.swift index 482655f..0ad3787 100644 --- a/Sources/ObjectRepresentation.swift +++ b/Sources/ObjectRepresentation.swift @@ -26,23 +26,37 @@ import CoreData +// MARK: - AnyObjectRepresentation + +/** + Used internally by CoreStore. Do not conform to directly. + */ +public protocol AnyObjectRepresentation { + + /** + The internal ID for the object. + */ + func objectID() -> NSManagedObjectID + + /** + Used internally by CoreStore. Do not call directly. + */ + func cs_dataStack() -> DataStack? +} + + // MARK - ObjectRepresentation /** An object that acts as interfaces for `CoreStoreObject`s or `NSManagedObject`s */ -public protocol ObjectRepresentation { +public protocol ObjectRepresentation: AnyObjectRepresentation { /** The object type represented by this protocol */ associatedtype ObjectType: DynamicObject - /** - The internal ID for the object. - */ - func objectID() -> ObjectType.ObjectID - /** An instance that may be observed for object changes. */ @@ -67,11 +81,6 @@ public protocol ObjectRepresentation { A thread-safe `struct` that is a full-copy of the object's properties */ func asSnapshot(in transaction: BaseDataTransaction) -> ObjectSnapshot? - - /** - Used internally by CoreStore. Do not call directly. - */ - func cs_dataStack() -> DataStack? } extension NSManagedObject: ObjectRepresentation {} @@ -101,14 +110,22 @@ extension DynamicObject where Self: ObjectRepresentation { .managedObjectContext .flatMap({ ObjectSnapshot(objectID: self.cs_id(), context: $0) }) } - - - // MARK: ObjectRepresentation - + + + // MARK: AnyObjectRepresentation + public func objectID() -> Self.ObjectID { return self.cs_id() } + + public func cs_dataStack() -> DataStack? { + + return self.cs_toRaw().managedObjectContext?.parentStack + } + + + // MARK: ObjectRepresentation public func asPublisher(in dataStack: DataStack) -> ObjectPublisher { @@ -147,9 +164,4 @@ extension DynamicObject where Self: ObjectRepresentation { let context = transaction.unsafeContext() return ObjectSnapshot(objectID: self.cs_id(), context: context) } - - public func cs_dataStack() -> DataStack? { - - return self.cs_toRaw().managedObjectContext?.parentStack - } } diff --git a/Sources/ObjectSnapshot.swift b/Sources/ObjectSnapshot.swift index b4432ee..ba67b64 100644 --- a/Sources/ObjectSnapshot.swift +++ b/Sources/ObjectSnapshot.swift @@ -48,17 +48,25 @@ public struct ObjectSnapshot: ObjectRepresentation, Hashable { return self.values } - - // MARK: ObjectRepresentation - - public typealias ObjectType = O + + // MARK: AnyObjectRepresentation public func objectID() -> O.ObjectID { return self.id } + public func cs_dataStack() -> DataStack? { + + return self.context.parentStack + } + + + // MARK: ObjectRepresentation + + public typealias ObjectType = O + public func asPublisher(in dataStack: DataStack) -> ObjectPublisher { let context = dataStack.unsafeContext() @@ -86,11 +94,6 @@ public struct ObjectSnapshot: ObjectRepresentation, Hashable { let context = transaction.unsafeContext() return ObjectSnapshot(objectID: self.id, context: context) } - - public func cs_dataStack() -> DataStack? { - - return self.context.parentStack - } // MARK: Equatable