mirror of
https://github.com/JohnEstropia/CoreStore.git
synced 2026-03-27 11:51:31 +01:00
added changed keys to object changes notification
This commit is contained in:
@@ -28,9 +28,7 @@ import CoreData
|
|||||||
import GCDKit
|
import GCDKit
|
||||||
|
|
||||||
|
|
||||||
private let ManagedObjectListControllerWillChangeListNotification = "ManagedObjectListControllerWillChangeListNotification"
|
private let ManagedObjectListControllerWillChangeObjectNotification = "ManagedObjectListControllerWillChangeObjectNotification"
|
||||||
private let ManagedObjectListControllerDidChangeListNotification = "ManagedObjectListControllerDidChangeListNotification"
|
|
||||||
|
|
||||||
private let ManagedObjectListControllerDidDeleteObjectNotification = "ManagedObjectListControllerDidDeleteObjectNotification"
|
private let ManagedObjectListControllerDidDeleteObjectNotification = "ManagedObjectListControllerDidDeleteObjectNotification"
|
||||||
private let ManagedObjectListControllerDidUpdateObjectNotification = "ManagedObjectListControllerDidUpdateObjectNotification"
|
private let ManagedObjectListControllerDidUpdateObjectNotification = "ManagedObjectListControllerDidUpdateObjectNotification"
|
||||||
|
|
||||||
@@ -38,9 +36,7 @@ private let UserInfoKeyObject = "UserInfoKeyObject"
|
|||||||
|
|
||||||
private struct NotificationKey {
|
private struct NotificationKey {
|
||||||
|
|
||||||
static var willChangeList: Void?
|
static var willChangeObject: Void?
|
||||||
static var didChangeList: Void?
|
|
||||||
|
|
||||||
static var didDeleteObject: Void?
|
static var didDeleteObject: Void?
|
||||||
static var didUpdateObject: Void?
|
static var didUpdateObject: Void?
|
||||||
}
|
}
|
||||||
@@ -67,25 +63,24 @@ public final class ManagedObjectController<T: NSManagedObject>: FetchedResultsCo
|
|||||||
HardcoreData.assert(GCDQueue.Main.isCurrentExecutionContext(), "Attempted to add a \(typeName(observer)) outside the main queue.")
|
HardcoreData.assert(GCDQueue.Main.isCurrentExecutionContext(), "Attempted to add a \(typeName(observer)) outside the main queue.")
|
||||||
|
|
||||||
self.registerChangeNotification(
|
self.registerChangeNotification(
|
||||||
&NotificationKey.willChangeList,
|
&NotificationKey.willChangeObject,
|
||||||
name: ManagedObjectListControllerWillChangeListNotification,
|
name: ManagedObjectListControllerWillChangeObjectNotification,
|
||||||
toObserver: observer,
|
toObserver: observer,
|
||||||
callback: { [weak observer, weak self] (objectController) -> Void in
|
callback: { [weak self, weak observer] (objectController) -> Void in
|
||||||
|
|
||||||
if let observer = observer, let object = self?.object {
|
if let strongSelf = self, let object = strongSelf.object, let observer = observer {
|
||||||
|
|
||||||
observer.managedObjectWillUpdate(objectController, object: object)
|
observer.managedObjectWillUpdate(objectController, object: object)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
self.registerObjectNotification(
|
self.registerObjectNotification(
|
||||||
&NotificationKey.didDeleteObject,
|
&NotificationKey.didDeleteObject,
|
||||||
name: ManagedObjectListControllerDidDeleteObjectNotification,
|
name: ManagedObjectListControllerDidDeleteObjectNotification,
|
||||||
toObserver: observer,
|
toObserver: observer,
|
||||||
callback: { [weak observer] (objectController, object) -> Void in
|
callback: { [weak self, weak observer] (objectController, object) -> Void in
|
||||||
|
|
||||||
if let observer = observer {
|
if let strongSelf = self, let observer = observer {
|
||||||
|
|
||||||
observer.managedObjectWasDeleted(objectController, object: object)
|
observer.managedObjectWasDeleted(objectController, object: object)
|
||||||
}
|
}
|
||||||
@@ -95,11 +90,28 @@ public final class ManagedObjectController<T: NSManagedObject>: FetchedResultsCo
|
|||||||
&NotificationKey.didUpdateObject,
|
&NotificationKey.didUpdateObject,
|
||||||
name: ManagedObjectListControllerDidUpdateObjectNotification,
|
name: ManagedObjectListControllerDidUpdateObjectNotification,
|
||||||
toObserver: observer,
|
toObserver: observer,
|
||||||
callback: { [weak observer] (objectController, object) -> Void in
|
callback: { [weak self, weak observer] (objectController, object) -> Void in
|
||||||
|
|
||||||
if let observer = observer {
|
if let strongSelf = self, let observer = observer {
|
||||||
|
|
||||||
observer.managedObjectWasUpdated(objectController, object: object)
|
let previousCommitedAttributes = strongSelf.lastCommittedAttributes
|
||||||
|
let currentCommitedAttributes = object.committedValuesForKeys(nil) as! [NSString: NSObject]
|
||||||
|
|
||||||
|
var changedKeys = Set<String>()
|
||||||
|
for key in currentCommitedAttributes.keys {
|
||||||
|
|
||||||
|
if previousCommitedAttributes[key] != currentCommitedAttributes[key] {
|
||||||
|
|
||||||
|
changedKeys.insert(key as String)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
strongSelf.lastCommittedAttributes = currentCommitedAttributes
|
||||||
|
observer.managedObjectWasUpdated(
|
||||||
|
objectController,
|
||||||
|
object: object,
|
||||||
|
changedPersistentKeys: changedKeys
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -110,8 +122,7 @@ public final class ManagedObjectController<T: NSManagedObject>: FetchedResultsCo
|
|||||||
HardcoreData.assert(GCDQueue.Main.isCurrentExecutionContext(), "Attempted to remove a \(typeName(observer)) outside the main queue.")
|
HardcoreData.assert(GCDQueue.Main.isCurrentExecutionContext(), "Attempted to remove a \(typeName(observer)) outside the main queue.")
|
||||||
|
|
||||||
let nilValue: AnyObject? = nil
|
let nilValue: AnyObject? = nil
|
||||||
setAssociatedRetainedObject(nilValue, forKey: &NotificationKey.willChangeList, inObject: observer)
|
setAssociatedRetainedObject(nilValue, forKey: &NotificationKey.willChangeObject, inObject: observer)
|
||||||
|
|
||||||
setAssociatedRetainedObject(nilValue, forKey: &NotificationKey.didDeleteObject, inObject: observer)
|
setAssociatedRetainedObject(nilValue, forKey: &NotificationKey.didDeleteObject, inObject: observer)
|
||||||
setAssociatedRetainedObject(nilValue, forKey: &NotificationKey.didUpdateObject, inObject: observer)
|
setAssociatedRetainedObject(nilValue, forKey: &NotificationKey.didUpdateObject, inObject: observer)
|
||||||
}
|
}
|
||||||
@@ -145,15 +156,7 @@ public final class ManagedObjectController<T: NSManagedObject>: FetchedResultsCo
|
|||||||
private func controllerWillChangeContent(controller: NSFetchedResultsController) {
|
private func controllerWillChangeContent(controller: NSFetchedResultsController) {
|
||||||
|
|
||||||
NSNotificationCenter.defaultCenter().postNotificationName(
|
NSNotificationCenter.defaultCenter().postNotificationName(
|
||||||
ManagedObjectListControllerWillChangeListNotification,
|
ManagedObjectListControllerWillChangeObjectNotification,
|
||||||
object: self
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private func controllerDidChangeContent(controller: NSFetchedResultsController) {
|
|
||||||
|
|
||||||
NSNotificationCenter.defaultCenter().postNotificationName(
|
|
||||||
ManagedObjectListControllerDidChangeListNotification,
|
|
||||||
object: self
|
object: self
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -171,7 +174,8 @@ public final class ManagedObjectController<T: NSManagedObject>: FetchedResultsCo
|
|||||||
fetchRequest.resultType = .ManagedObjectResultType
|
fetchRequest.resultType = .ManagedObjectResultType
|
||||||
fetchRequest.sortDescriptors = []
|
fetchRequest.sortDescriptors = []
|
||||||
|
|
||||||
Where("SELF", isEqualTo: object).applyToFetchRequest(fetchRequest)
|
let originalObjectID = object.objectID
|
||||||
|
Where("SELF", isEqualTo: originalObjectID).applyToFetchRequest(fetchRequest)
|
||||||
|
|
||||||
let fetchedResultsController = NSFetchedResultsController(
|
let fetchedResultsController = NSFetchedResultsController(
|
||||||
fetchRequest: fetchRequest,
|
fetchRequest: fetchRequest,
|
||||||
@@ -182,6 +186,7 @@ public final class ManagedObjectController<T: NSManagedObject>: FetchedResultsCo
|
|||||||
|
|
||||||
let fetchedResultsControllerDelegate = FetchedResultsControllerDelegate()
|
let fetchedResultsControllerDelegate = FetchedResultsControllerDelegate()
|
||||||
|
|
||||||
|
self.originalObjectID = originalObjectID
|
||||||
self.fetchedResultsController = fetchedResultsController
|
self.fetchedResultsController = fetchedResultsController
|
||||||
self.fetchedResultsControllerDelegate = fetchedResultsControllerDelegate
|
self.fetchedResultsControllerDelegate = fetchedResultsControllerDelegate
|
||||||
self.parentStack = dataStack
|
self.parentStack = dataStack
|
||||||
@@ -196,13 +201,17 @@ public final class ManagedObjectController<T: NSManagedObject>: FetchedResultsCo
|
|||||||
error ?? NSError(hardcoreDataErrorCode: .UnknownError),
|
error ?? NSError(hardcoreDataErrorCode: .UnknownError),
|
||||||
"Failed to perform fetch on <\(NSFetchedResultsController.self)>.")
|
"Failed to perform fetch on <\(NSFetchedResultsController.self)>.")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.lastCommittedAttributes = (self.object?.committedValuesForKeys(nil) as? [NSString: NSObject]) ?? [:]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// MARK: Private
|
// MARK: Private
|
||||||
|
|
||||||
|
private let originalObjectID: NSManagedObjectID
|
||||||
private let fetchedResultsController: NSFetchedResultsController
|
private let fetchedResultsController: NSFetchedResultsController
|
||||||
private let fetchedResultsControllerDelegate: FetchedResultsControllerDelegate
|
private let fetchedResultsControllerDelegate: FetchedResultsControllerDelegate
|
||||||
|
private var lastCommittedAttributes = [NSString: NSObject]()
|
||||||
private weak var parentStack: DataStack?
|
private weak var parentStack: DataStack?
|
||||||
|
|
||||||
private func registerChangeNotification(notificationKey: UnsafePointer<Void>, name: String, toObserver observer: AnyObject, callback: (objectController: ManagedObjectController<T>) -> Void) {
|
private func registerChangeNotification(notificationKey: UnsafePointer<Void>, name: String, toObserver observer: AnyObject, callback: (objectController: ManagedObjectController<T>) -> Void) {
|
||||||
@@ -257,8 +266,6 @@ private protocol FetchedResultsControllerHandler: class {
|
|||||||
func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?)
|
func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?)
|
||||||
|
|
||||||
func controllerWillChangeContent(controller: NSFetchedResultsController)
|
func controllerWillChangeContent(controller: NSFetchedResultsController)
|
||||||
|
|
||||||
func controllerDidChangeContent(controller: NSFetchedResultsController)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -273,11 +280,6 @@ private final class FetchedResultsControllerDelegate: NSFetchedResultsController
|
|||||||
self.handler?.controllerWillChangeContent(controller)
|
self.handler?.controllerWillChangeContent(controller)
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc func controllerDidChangeContent(controller: NSFetchedResultsController) {
|
|
||||||
|
|
||||||
self.handler?.controllerDidChangeContent(controller)
|
|
||||||
}
|
|
||||||
|
|
||||||
@objc func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) {
|
@objc func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) {
|
||||||
|
|
||||||
self.handler?.controller(controller, didChangeObject: anObject, atIndexPath: indexPath, forChangeType: type, newIndexPath: newIndexPath)
|
self.handler?.controller(controller, didChangeObject: anObject, atIndexPath: indexPath, forChangeType: type, newIndexPath: newIndexPath)
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ public protocol ManagedObjectObserver: class {
|
|||||||
|
|
||||||
func managedObjectWillUpdate(objectController: ManagedObjectController<EntityType>, object: EntityType)
|
func managedObjectWillUpdate(objectController: ManagedObjectController<EntityType>, object: EntityType)
|
||||||
|
|
||||||
func managedObjectWasUpdated(objectController: ManagedObjectController<EntityType>, object: EntityType)
|
func managedObjectWasUpdated(objectController: ManagedObjectController<EntityType>, object: EntityType, changedPersistentKeys: Set<KeyPath>)
|
||||||
|
|
||||||
func managedObjectWasDeleted(objectController: ManagedObjectController<EntityType>, object: EntityType)
|
func managedObjectWasDeleted(objectController: ManagedObjectController<EntityType>, object: EntityType)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,22 +1,42 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="7702" systemVersion="14D136" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="Ni8-QF-XHB">
|
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="7706" systemVersion="14D136" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="Ni8-QF-XHB">
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7701"/>
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7703"/>
|
||||||
<capability name="Aspect ratio constraints" minToolsVersion="5.1"/>
|
<capability name="Aspect ratio constraints" minToolsVersion="5.1"/>
|
||||||
<capability name="Constraints to layout margins" minToolsVersion="6.0"/>
|
<capability name="Constraints to layout margins" minToolsVersion="6.0"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<scenes>
|
<scenes>
|
||||||
<!--Demo-->
|
<!--HardcoreData Demos-->
|
||||||
<scene sceneID="0Be-vc-h1W">
|
<scene sceneID="0Be-vc-h1W">
|
||||||
<objects>
|
<objects>
|
||||||
<tableViewController id="t0d-B0-B7U" sceneMemberID="viewController">
|
<tableViewController id="t0d-B0-B7U" sceneMemberID="viewController">
|
||||||
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="plain" separatorStyle="default" rowHeight="50" sectionHeaderHeight="22" sectionFooterHeight="22" id="uHB-Yr-ujV">
|
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="uHB-Yr-ujV">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
|
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
<color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
|
||||||
<sections>
|
<sections>
|
||||||
<tableViewSection headerTitle="Demos" id="wIP-Hn-YfF">
|
<tableViewSection id="wIP-Hn-YfF">
|
||||||
<cells>
|
<cells>
|
||||||
|
<tableViewCell contentMode="scaleToFill" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="Q3n-Df-v1t" detailTextLabel="Hbn-cf-Y7m" style="IBUITableViewCellStyleSubtitle" id="AXm-KE-45G">
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="AXm-KE-45G" id="9te-Wx-hkf">
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Q3n-Df-v1t">
|
||||||
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||||
|
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
|
||||||
|
<nil key="highlightedColor"/>
|
||||||
|
</label>
|
||||||
|
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Setting up multiple persistent store configurations" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Hbn-cf-Y7m">
|
||||||
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
|
<fontDescription key="fontDescription" type="system" pointSize="11"/>
|
||||||
|
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
|
||||||
|
<nil key="highlightedColor"/>
|
||||||
|
</label>
|
||||||
|
</subviews>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
</tableViewCell>
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="vpt-cT-gMo" detailTextLabel="ou9-TZ-8bf" style="IBUITableViewCellStyleSubtitle" id="fsb-zw-8Ii">
|
<tableViewCell contentMode="scaleToFill" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="vpt-cT-gMo" detailTextLabel="ou9-TZ-8bf" style="IBUITableViewCellStyleSubtitle" id="fsb-zw-8Ii">
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="fsb-zw-8Ii" id="Upm-AO-Fw3">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="fsb-zw-8Ii" id="Upm-AO-Fw3">
|
||||||
@@ -24,7 +44,7 @@
|
|||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Colors" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="vpt-cT-gMo">
|
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Colors" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="vpt-cT-gMo">
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="16"/>
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||||
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
|
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
@@ -40,18 +60,58 @@
|
|||||||
<segue destination="YOI-b7-Nxn" kind="show" id="29o-wO-3LK"/>
|
<segue destination="YOI-b7-Nxn" kind="show" id="29o-wO-3LK"/>
|
||||||
</connections>
|
</connections>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="quG-kg-ady" detailTextLabel="hPD-ed-MbJ" style="IBUITableViewCellStyleSubtitle" id="OnF-07-qx3">
|
<tableViewCell contentMode="scaleToFill" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="UbU-Kd-yrY" detailTextLabel="uP1-Jc-o9v" style="IBUITableViewCellStyleSubtitle" id="ekW-PJ-mbo">
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="OnF-07-qx3" id="3rZ-A6-AuF">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="ekW-PJ-mbo" id="CYq-mg-PVS">
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Observing a Single Object" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="quG-kg-ady">
|
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="UbU-Kd-yrY">
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="16"/>
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||||
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
|
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="ManagedObjectController and ManagedObjectObserver" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="hPD-ed-MbJ">
|
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Making changes with transactions" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="uP1-Jc-o9v">
|
||||||
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
|
<fontDescription key="fontDescription" type="system" pointSize="11"/>
|
||||||
|
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
|
||||||
|
<nil key="highlightedColor"/>
|
||||||
|
</label>
|
||||||
|
</subviews>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
</tableViewCell>
|
||||||
|
<tableViewCell contentMode="scaleToFill" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="ZfY-Aq-Ykq" detailTextLabel="QzD-9b-k1j" style="IBUITableViewCellStyleSubtitle" id="wyK-rk-3tI">
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="wyK-rk-3tI" id="fLd-KK-QcW">
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="ZfY-Aq-Ykq">
|
||||||
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||||
|
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
|
||||||
|
<nil key="highlightedColor"/>
|
||||||
|
</label>
|
||||||
|
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Fetching objects and raw values" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="QzD-9b-k1j">
|
||||||
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
|
<fontDescription key="fontDescription" type="system" pointSize="11"/>
|
||||||
|
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
|
||||||
|
<nil key="highlightedColor"/>
|
||||||
|
</label>
|
||||||
|
</subviews>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
</tableViewCell>
|
||||||
|
<tableViewCell contentMode="scaleToFill" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="C8Y-0y-lEG" detailTextLabel="jZw-qE-0ws" style="IBUITableViewCellStyleSubtitle" id="ph1-8z-C1m">
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="ph1-8z-C1m" id="nNz-rd-ksg">
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="C8Y-0y-lEG">
|
||||||
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||||
|
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
|
||||||
|
<nil key="highlightedColor"/>
|
||||||
|
</label>
|
||||||
|
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Implementing a custom logger" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="jZw-qE-0ws">
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="11"/>
|
<fontDescription key="fontDescription" type="system" pointSize="11"/>
|
||||||
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
|
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
|
||||||
@@ -68,7 +128,7 @@
|
|||||||
<outlet property="delegate" destination="t0d-B0-B7U" id="Yta-gX-xFD"/>
|
<outlet property="delegate" destination="t0d-B0-B7U" id="Yta-gX-xFD"/>
|
||||||
</connections>
|
</connections>
|
||||||
</tableView>
|
</tableView>
|
||||||
<navigationItem key="navigationItem" title="Demo" id="3bj-zE-UYZ"/>
|
<navigationItem key="navigationItem" title="HardcoreData Demos" id="3bj-zE-UYZ"/>
|
||||||
</tableViewController>
|
</tableViewController>
|
||||||
<placeholder placeholderIdentifier="IBFirstResponder" id="Xgp-Zn-Sbp" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
<placeholder placeholderIdentifier="IBFirstResponder" id="Xgp-Zn-Sbp" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||||
</objects>
|
</objects>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
<model userDefinedModelVersionIdentifier="" type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="7549" systemVersion="14D136" minimumToolsVersion="Automatic" macOSVersion="Automatic" iOSVersion="Automatic">
|
<model userDefinedModelVersionIdentifier="" type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="7701" systemVersion="14D136" minimumToolsVersion="Automatic" macOSVersion="Automatic" iOSVersion="Automatic">
|
||||||
<entity name="Palette" representedClassName="HardcoreDataDemo.Palette">
|
<entity name="Palette" representedClassName="HardcoreDataDemo.Palette">
|
||||||
<attribute name="brightness" optional="YES" attributeType="Float" defaultValueString="0.0" syncable="YES"/>
|
<attribute name="brightness" optional="YES" attributeType="Float" defaultValueString="0.0" syncable="YES"/>
|
||||||
<attribute name="colorName" optional="YES" transient="YES" attributeType="String" syncable="YES"/>
|
<attribute name="colorName" optional="YES" transient="YES" attributeType="String" syncable="YES"/>
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ class ObjectObserverDemoViewController: UIViewController, ManagedObjectObserver
|
|||||||
|
|
||||||
if let palette = self.objectController?.object {
|
if let palette = self.objectController?.object {
|
||||||
|
|
||||||
self.reloadPaletteInfo(palette)
|
self.reloadPaletteInfo(palette, changedKeys: nil)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -85,9 +85,9 @@ class ObjectObserverDemoViewController: UIViewController, ManagedObjectObserver
|
|||||||
// none
|
// none
|
||||||
}
|
}
|
||||||
|
|
||||||
func managedObjectWasUpdated(objectController: ManagedObjectController<Palette>, object: Palette) {
|
func managedObjectWasUpdated(objectController: ManagedObjectController<Palette>, object: Palette, changedPersistentKeys: Set<KeyPath>) {
|
||||||
|
|
||||||
self.reloadPaletteInfo(object)
|
self.reloadPaletteInfo(object, changedKeys: changedPersistentKeys)
|
||||||
}
|
}
|
||||||
|
|
||||||
func managedObjectWasDeleted(objectController: ManagedObjectController<Palette>, object: Palette) {
|
func managedObjectWasDeleted(objectController: ManagedObjectController<Palette>, object: Palette) {
|
||||||
@@ -166,7 +166,7 @@ class ObjectObserverDemoViewController: UIViewController, ManagedObjectObserver
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func reloadPaletteInfo(palette: Palette) {
|
func reloadPaletteInfo(palette: Palette, changedKeys: Set<String>?) {
|
||||||
|
|
||||||
self.colorNameLabel?.text = palette.colorName
|
self.colorNameLabel?.text = palette.colorName
|
||||||
|
|
||||||
@@ -179,17 +179,18 @@ class ObjectObserverDemoViewController: UIViewController, ManagedObjectObserver
|
|||||||
let hue = palette.hue
|
let hue = palette.hue
|
||||||
let saturation = palette.saturation
|
let saturation = palette.saturation
|
||||||
let brightness = palette.brightness
|
let brightness = palette.brightness
|
||||||
if Int32(self.hueSlider?.value ?? 0) != hue {
|
|
||||||
|
if changedKeys == nil || changedKeys?.contains("hue") == true {
|
||||||
|
|
||||||
self.hueSlider?.value = Float(hue)
|
self.hueSlider?.value = Float(palette.hue)
|
||||||
}
|
}
|
||||||
if self.saturationSlider?.value != saturation {
|
if changedKeys == nil || changedKeys?.contains("saturation") == true {
|
||||||
|
|
||||||
self.saturationSlider?.value = saturation
|
self.saturationSlider?.value = palette.saturation
|
||||||
}
|
}
|
||||||
if self.brightnessSlider?.value != brightness {
|
if changedKeys == nil || changedKeys?.contains("brightness") == true {
|
||||||
|
|
||||||
self.brightnessSlider?.value = brightness
|
self.brightnessSlider?.value = palette.brightness
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user