Last active
June 5, 2022 04:05
-
-
Save flaviodsilverio/e7169e2a44b5f0ae51d763c0e1a3612d to your computer and use it in GitHub Desktop.
Useful Extensions for NSManagedObject + NSManagedObjectContext
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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