Skip to content

Commit

Permalink
updated async saves and delegation to be called on the main thread fo…
Browse files Browse the repository at this point in the history
…r UI changes
  • Loading branch information
danieldahan committed Feb 6, 2016
1 parent f7af2b6 commit 9eaee23
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 50 deletions.
2 changes: 1 addition & 1 deletion Graph.podspec
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Pod::Spec.new do |s|
s.name = 'Graph'
s.version = '1.0.3'
s.version = '1.0.4'
s.license = 'BSD'
s.summary = 'An elegant data-driven framework for CoreData in Swift.'
s.homepage = 'http://cosmicmind.io'
Expand Down
111 changes: 63 additions & 48 deletions Sources/GraphWatch.swift
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,69 @@ public extension Graph {
// :name: managedObjectContextDidSave
//
internal func managedObjectContextDidSave(notification: NSNotification) {
if NSThread.isMainThread() {
notifyWatchers(notification)
} else {
dispatch_sync(dispatch_get_main_queue()) { [unowned self] in
self.notifyWatchers(notification)
}
}
}

//
// :name: prepareForObservation
//
internal func prepareForObservation() {
NSNotificationCenter.defaultCenter().removeObserver(self)
NSNotificationCenter.defaultCenter().removeObserver(self, name: NSManagedObjectContextDidSaveNotification, object: context)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "managedObjectContextDidSave:", name: NSManagedObjectContextDidSaveNotification, object: context)
}

//
// :name: addPredicateToObserve
//
internal func addPredicateToObserve(entityDescription: NSEntityDescription, predicate: NSPredicate) {
let entityPredicate: NSPredicate = NSPredicate(format: "entity.name == %@", entityDescription.name! as NSString)
let predicates: Array<NSPredicate> = [entityPredicate, predicate]
let finalPredicate: NSPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: predicates)
masterPredicate = nil == masterPredicate ? finalPredicate : NSCompoundPredicate(orPredicateWithSubpredicates: [masterPredicate!, finalPredicate])
}

//
// :name: isWatching
//
internal func isWatching(key: String, index: String) -> Bool {
if nil == watchers[key] {
watchers[key] = Array<String>(arrayLiteral: index)
return false
}
if watchers[key]!.contains(index) {
return true
}
watchers[key]!.append(index)
return false
}

//
// :name: addWatcher
//
internal func addWatcher(key: String, value: String, index: String, entityDescriptionName: String, managedObjectClassName: String) {
if !isWatching(value, index: index) {
let entityDescription: NSEntityDescription = NSEntityDescription()
entityDescription.name = entityDescriptionName
entityDescription.managedObjectClassName = managedObjectClassName
let predicate: NSPredicate = NSPredicate(format: "%K LIKE %@", key as NSString, value as NSString)
addPredicateToObserve(entityDescription, predicate: predicate)
prepareForObservation()
}
}

/**
Notifies watchers of changes within the ManagedObjectContext.
- Parameter notification: An NSNotification passed from the context
save operation.
*/
private func notifyWatchers(notification: NSNotification) {
let moc: NSManagedObjectContext = context!
moc.mergeChangesFromContextDidSaveNotification(notification)

Expand Down Expand Up @@ -277,52 +340,4 @@ public extension Graph {
}
}
}

//
// :name: prepareForObservation
//
internal func prepareForObservation() {
NSNotificationCenter.defaultCenter().removeObserver(self)
NSNotificationCenter.defaultCenter().removeObserver(self, name: NSManagedObjectContextDidSaveNotification, object: context)
NSNotificationCenter.defaultCenter().addObserver(self, selector: "managedObjectContextDidSave:", name: NSManagedObjectContextDidSaveNotification, object: context)
}

//
// :name: addPredicateToObserve
//
internal func addPredicateToObserve(entityDescription: NSEntityDescription, predicate: NSPredicate) {
let entityPredicate: NSPredicate = NSPredicate(format: "entity.name == %@", entityDescription.name! as NSString)
let predicates: Array<NSPredicate> = [entityPredicate, predicate]
let finalPredicate: NSPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: predicates)
masterPredicate = nil == masterPredicate ? finalPredicate : NSCompoundPredicate(orPredicateWithSubpredicates: [masterPredicate!, finalPredicate])
}

//
// :name: isWatching
//
internal func isWatching(key: String, index: String) -> Bool {
if nil == watchers[key] {
watchers[key] = Array<String>(arrayLiteral: index)
return false
}
if watchers[key]!.contains(index) {
return true
}
watchers[key]!.append(index)
return false
}

//
// :name: addWatcher
//
internal func addWatcher(key: String, value: String, index: String, entityDescriptionName: String, managedObjectClassName: String) {
if !isWatching(value, index: index) {
let entityDescription: NSEntityDescription = NSEntityDescription()
entityDescription.name = entityDescriptionName
entityDescription.managedObjectClassName = managedObjectClassName
let predicate: NSPredicate = NSPredicate(format: "%K LIKE %@", key as NSString, value as NSString)
addPredicateToObserve(entityDescription, predicate: predicate)
prepareForObservation()
}
}
}
2 changes: 1 addition & 1 deletion Sources/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0.3</string>
<string>1.0.4</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
Expand Down

0 comments on commit 9eaee23

Please sign in to comment.