added demo for observing changes to a single managed object

This commit is contained in:
John Rommel Estropia
2015-05-07 00:30:45 +09:00
parent 8d42a4a885
commit eade08d0cd
12 changed files with 439 additions and 136 deletions

View File

@@ -108,7 +108,7 @@ public final class AsynchronousDataTransaction: BaseDataTransaction {
:param: object the NSManagedObject type to be edited
:returns: an editable proxy for the specified NSManagedObject.
*/
public override func fetch<T: NSManagedObject>(object: T) -> T? {
public override func fetch<T: NSManagedObject>(object: T?) -> T? {
HardcoreData.assert(!self.isCommitted, "Attempted to update an entity of type \(typeName(object)) from an already committed \(typeName(self)).")
@@ -120,7 +120,7 @@ public final class AsynchronousDataTransaction: BaseDataTransaction {
:param: object the NSManagedObject type to be deleted
*/
public override func delete(object: NSManagedObject) {
public override func delete(object: NSManagedObject?) {
HardcoreData.assert(!self.isCommitted, "Attempted to delete an entity of type \(typeName(object)) from an already committed \(typeName(self)).")

View File

@@ -61,11 +61,11 @@ public /*abstract*/ class BaseDataTransaction {
:param: object the NSManagedObject type to be edited
:returns: an editable proxy for the specified NSManagedObject.
*/
public func fetch<T: NSManagedObject>(object: T) -> T? {
public func fetch<T: NSManagedObject>(object: T?) -> T? {
HardcoreData.assert(self.transactionQueue.isCurrentExecutionContext(), "Attempted to update an entity of type \(typeName(object)) outside its designated queue.")
return object.inContext(self.context)
return object?.inContext(self.context)
}
/**
@@ -73,11 +73,11 @@ public /*abstract*/ class BaseDataTransaction {
:param: object the NSManagedObject type to be deleted
*/
public func delete(object: NSManagedObject) {
public func delete(object: NSManagedObject?) {
HardcoreData.assert(self.transactionQueue.isCurrentExecutionContext(), "Attempted to delete an entity of type \(typeName(object)) outside its designated queue.")
object.inContext(self.context)?.deleteFromContext()
object?.inContext(self.context)?.deleteFromContext()
}
// MARK: Saving changes

View File

@@ -46,6 +46,11 @@ public extension DataStack {
public func observeObjectList<T: NSManagedObject>(from: From<T>, _ groupBy: GroupBy? = nil, _ queryClauses: FetchClause...) -> ManagedObjectListController<T> {
return self.observeObjectList(from, groupBy, queryClauses)
}
public func observeObjectList<T: NSManagedObject>(from: From<T>, _ groupBy: GroupBy? = nil, _ queryClauses: [FetchClause]) -> ManagedObjectListController<T> {
HardcoreData.assert(GCDQueue.Main.isCurrentExecutionContext(), "Attempted to observe objects from \(typeName(self)) outside the main queue.")
// TODO: sectionNameKeyPath and cacheResults

View File

@@ -0,0 +1,27 @@
//
// HardcoreData+Observing.swift
// HardcoreData
//
// Created by John Rommel Estropia on 2015/05/06.
// Copyright (c) 2015 John Rommel Estropia. All rights reserved.
//
import Foundation
// MARK: - HardcoreData
public extension HardcoreData {
// MARK: Public
public static func observeObject<T: NSManagedObject>(object: T) -> ManagedObjectController<T> {
return self.defaultStack.observeObject(object)
}
public static func observeObjectList<T: NSManagedObject>(from: From<T>, _ groupBy: GroupBy? = nil, _ queryClauses: FetchClause...) -> ManagedObjectListController<T> {
return self.defaultStack.observeObjectList(from, groupBy, queryClauses)
}
}

View File

@@ -169,9 +169,9 @@ public final class ManagedObjectController<T: NSManagedObject>: FetchedResultsCo
fetchRequest.entity = context.entityDescriptionForEntityClass(T.self)
fetchRequest.fetchLimit = 1
fetchRequest.resultType = .ManagedObjectResultType
fetchRequest.sortDescriptors = []
Where("SELF", isEqualTo: object).applyToFetchRequest(fetchRequest)
SortedBy(.Ascending("objectID")).applyToFetchRequest(fetchRequest)
let fetchedResultsController = NSFetchedResultsController(
fetchRequest: fetchRequest,

View File

@@ -66,7 +66,7 @@ public final class SynchronousDataTransaction: BaseDataTransaction {
:param: object the NSManagedObject type to be edited
:returns: an editable proxy for the specified NSManagedObject.
*/
public override func fetch<T: NSManagedObject>(object: T) -> T? {
public override func fetch<T: NSManagedObject>(object: T?) -> T? {
HardcoreData.assert(!self.isCommitted, "Attempted to update an entity of type \(typeName(object)) from an already committed \(typeName(self)).")
@@ -78,7 +78,7 @@ public final class SynchronousDataTransaction: BaseDataTransaction {
:param: object the NSManagedObject type to be deleted
*/
public override func delete(object: NSManagedObject) {
public override func delete(object: NSManagedObject?) {
HardcoreData.assert(!self.isCommitted, "Attempted to delete an entity of type \(typeName(object)) from an already committed \(typeName(self)).")