Skip to content

Instantly share code, notes, and snippets.

@flaviodsilverio
Last active June 5, 2022 04:05
Show Gist options
  • Save flaviodsilverio/e7169e2a44b5f0ae51d763c0e1a3612d to your computer and use it in GitHub Desktop.
Save flaviodsilverio/e7169e2a44b5f0ae51d763c0e1a3612d to your computer and use it in GitHub Desktop.
Useful Extensions for NSManagedObject + NSManagedObjectContext
import CoreData
extension NSManagedObject {
class var entityName: String! {
get {
return self.entity().managedObjectClassName.components(separatedBy: ["."]).last!
}
}
public static func findOrCreate(objectWithPredicate predicate: NSPredicate, inManagedObjectContext moc: NSManagedObjectContext) -> NSManagedObject{
//First we should fetch an existing object in the context as a performance optimization
guard let existingObject = moc.find(objectMatchingPredicate: predicate) else {
return fetchOrCreate(objectMatchingPredicate: predicate, inContext: moc)
}
return existingObject
}
public static func fetch(OrCreateWithID id: String, inContext moc: NSManagedObjectContext) -> NSManagedObject{
let obj = fetchOrCreate(objectMatchingPredicate: NSPredicate(format: "id == %@", id), inContext: moc)
obj.setValue(id, forKey: "id")
return obj
}
public static func fetchOrCreate(objectMatchingPredicate predicate: NSPredicate, inContext moc: NSManagedObjectContext) -> NSManagedObject{
//if it's not in memory, we should execute a fetch to see if it exists
let fetchRequest = self.fetchRequest()
fetchRequest.predicate = predicate
fetchRequest.fetchLimit = 1
fetchRequest.returnsObjectsAsFaults = false
do {
let objects = try moc.fetch(fetchRequest)
if objects.count > 0 {
return objects.first as! NSManagedObject
}
} catch let error {
print(error)
}
//If it didn't exist in memory and wasn't fetched, we should create a new object
return createObject(inContext: moc)
}
public static func createObject(inContext moc: NSManagedObjectContext) -> NSManagedObject{
let newObject = NSEntityDescription.insertNewObject(forEntityName: entityName , into: moc)
return newObject
}
public static func fetchAll(inContext moc:NSManagedObjectContext) -> [NSManagedObject]{
let fetch = self.fetchRequest()
do {
let objects = try moc.fetch(fetch)
return objects as! [NSManagedObject]
} catch let error {
print(error)
}
return []
}
}
extension NSManagedObjectContext {
public func find(objectMatchingPredicate predicate: NSPredicate) -> NSManagedObject? {
for object in self.registeredObjects where !object.isFault {
if predicate.evaluate(with: object) {
return object
}
}
return nil
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment