Last active
February 6, 2022 13:47
-
-
Save somtd/7839383 to your computer and use it in GitHub Desktop.
CoreData utility class for LocalCacheSample #BLOG
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 "CoreDataController.h" | |
@interface CoreDataController () | |
@property (strong, nonatomic) NSManagedObjectContext *masterManagedObjectContext; | |
@property (strong, nonatomic) NSManagedObjectContext *backgroundManagedObjectContext; | |
@property (strong, nonatomic) NSManagedObjectModel *managedObjectModel; | |
@property (strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator; | |
@end | |
@implementation CoreDataController | |
+ (id)sharedInstance { | |
static dispatch_once_t once; | |
static CoreDataController *sharedInstance; | |
dispatch_once(&once, ^{ | |
sharedInstance = [[self alloc] init]; | |
}); | |
return sharedInstance; | |
} | |
#pragma mark - Core Data stack | |
// Used to propegate saves to the persistent store (disk) without blocking the UI | |
- (NSManagedObjectContext *)masterManagedObjectContext { | |
if (_masterManagedObjectContext != nil) { | |
return _masterManagedObjectContext; | |
} | |
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; | |
if (coordinator != nil) { | |
_masterManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; | |
[_masterManagedObjectContext performBlockAndWait:^{ | |
[_masterManagedObjectContext setPersistentStoreCoordinator:coordinator]; | |
}]; | |
} | |
return _masterManagedObjectContext; | |
} | |
// Return the NSManagedObjectContext to be used in the background during sync | |
- (NSManagedObjectContext *)backgroundManagedObjectContext { | |
if (_backgroundManagedObjectContext != nil) { | |
return _backgroundManagedObjectContext; | |
} | |
NSManagedObjectContext *masterContext = [self masterManagedObjectContext]; | |
if (masterContext != nil) { | |
_backgroundManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; | |
[_backgroundManagedObjectContext performBlockAndWait:^{ | |
[_backgroundManagedObjectContext setParentContext:masterContext]; | |
}]; | |
} | |
return _backgroundManagedObjectContext; | |
} | |
// Return the NSManagedObjectContext to be used in the background during sync | |
- (NSManagedObjectContext *)newManagedObjectContext { | |
NSManagedObjectContext *newContext = nil; | |
NSManagedObjectContext *masterContext = [self masterManagedObjectContext]; | |
if (masterContext != nil) { | |
newContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; | |
[newContext performBlockAndWait:^{ | |
[newContext setParentContext:masterContext]; | |
}]; | |
} | |
return newContext; | |
} | |
- (void)saveMasterContext { | |
[self.masterManagedObjectContext performBlockAndWait:^{ | |
NSError *error = nil; | |
BOOL saved = [self.masterManagedObjectContext save:&error]; | |
if (!saved) { | |
// do some real error handling | |
DLog(@"Could not save master context due to %@", error); | |
} | |
}]; | |
} | |
- (void)saveBackgroundContext { | |
[self.backgroundManagedObjectContext performBlockAndWait:^{ | |
NSError *error = nil; | |
BOOL saved = [self.backgroundManagedObjectContext save:&error]; | |
if (!saved) { | |
// do some real error handling | |
DLog(@"Could not save background context due to %@", error); | |
} | |
}]; | |
} | |
// Returns the managed object model for the application. | |
// If the model doesn't already exist, it is created from the application's model. | |
- (NSManagedObjectModel *)managedObjectModel | |
{ | |
if (_managedObjectModel != nil) { | |
return _managedObjectModel; | |
} | |
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:YOUR_APP_NAME withExtension:@"momd"]; | |
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; | |
return _managedObjectModel; | |
} | |
// Returns the persistent store coordinator for the application. | |
// If the coordinator doesn't already exist, it is created and the application's store added to it. | |
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator | |
{ | |
if (_persistentStoreCoordinator != nil) { | |
return _persistentStoreCoordinator; | |
} | |
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"YOURAPPNAME.sqlite"]; | |
NSError *error = nil; | |
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; | |
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) { | |
DLog(@"Unresolved error %@, %@", error, [error userInfo]); | |
abort(); | |
} | |
return _persistentStoreCoordinator; | |
} | |
#pragma mark - Application's Documents directory | |
// Returns the URL to the application's Documents directory. | |
- (NSURL *)applicationDocumentsDirectory | |
{ | |
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; | |
} | |
@end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment