Advertisement
Guest User

Untitled

a guest
May 15th, 2017
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.32 KB | None | 0 0
  1. //
  2. // DataBaseProvider.m
  3. // aurorafiles
  4. //
  5. // Created by Cheshire on 02.12.16.
  6. // Copyright © 2016 afterlogic. All rights reserved.
  7. //
  8.  
  9. #import "DataBaseProvider.h"
  10. #import "Folder.h"
  11.  
  12. @interface DataBaseProvider(){
  13.  
  14. }
  15. @property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
  16. @property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
  17. @property (nonatomic, readwrite, strong) NSManagedObjectContext *defaultMOC;
  18. @property (nonatomic, retain) NSOperationQueue *dataBaseOperationsQueue;
  19. @end
  20.  
  21. @implementation DataBaseProvider
  22.  
  23. @synthesize defaultMOC = _defaultMOC;
  24. @synthesize operationsMOC = _operationsMOC;
  25. @synthesize managedObjectModel = _managedObjectModel;
  26. @synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
  27.  
  28.  
  29. #pragma mark - initialize
  30. + (instancetype)sharedProvider{
  31. static DataBaseProvider *provider = nil;
  32. static dispatch_once_t onceToken;
  33. dispatch_once(&onceToken, ^{
  34. provider = [[DataBaseProvider alloc]init];
  35. });
  36. return provider;
  37. }
  38.  
  39. - (instancetype)init
  40. {
  41. self = [super init];
  42. if (self) {
  43. [[NSNotificationCenter defaultCenter]
  44. addObserverForName:NSManagedObjectContextDidSaveNotification
  45. object:nil
  46. queue:nil
  47. usingBlock:^(NSNotification* note) {
  48. NSManagedObjectContext *moc = _defaultMOC;
  49. if (note && note.object != moc)
  50. // if (note)
  51. {
  52. [moc performBlock:^(){
  53. [moc mergeChangesFromContextDidSaveNotification:note];
  54. }];
  55. }
  56.  
  57. }];
  58. self.dataBaseOperationsQueue = [[NSOperationQueue alloc]init];
  59. [self.dataBaseOperationsQueue setName:@"com.AuroraFiles.ClearCoreDataOperationsQueue"];
  60. }
  61. return self;
  62. }
  63.  
  64.  
  65. -(void)setupCoreDataStack{
  66. _managedObjectModel = [self managedObjectModel];
  67. _persistentStoreCoordinator = [self persistentStoreCoordinator];
  68. _defaultMOC = [self defaultMOC];
  69.  
  70.  
  71. }
  72.  
  73. #pragma mark - Managed Object Operations
  74.  
  75. -(void)saveWithBlockUsingTmpContext:(void(^)(NSManagedObjectContext *context))block{
  76. NSManagedObjectContext *tmpContext = self.operationsMOC;
  77. [tmpContext performBlock:^{
  78. if (block){
  79. block(tmpContext);
  80. }
  81.  
  82. NSError *error = [NSError new];
  83. if (![tmpContext save:&error])
  84. {
  85. //handle error
  86. NSLog(@"context saved in childContext- ❌. Error is -> %@",error.localizedDescription);
  87. }
  88.  
  89. [self.defaultMOC performBlock:^{
  90. NSError *error = [NSError new];
  91. if ([self.defaultMOC save:&error]) {
  92. NSLog(@"context saved -> ✅");
  93. }else{
  94. NSLog(@"context saved - ❌. Error is -> %@",error.localizedDescription);
  95. }
  96. }];
  97.  
  98. }];
  99. }
  100.  
  101. - (void)saveWithBlock:(void (^)(NSManagedObjectContext *context))block {
  102.  
  103. // [self.defaultMOC performBlock:^{
  104. // if (block) {
  105. // block(self.defaultMOC);
  106. // }
  107. // NSError *error = [NSError new];
  108. // if ([self.defaultMOC save:&error]) {
  109. // NSLog(@"context saved -> ✅");
  110. // }else{
  111. // NSLog(@"context saved - ❌. Error is -> %@",error.localizedDescription);
  112. // }
  113. // }];
  114. NSBlockOperation *saveOperation = [NSBlockOperation blockOperationWithBlock:^{
  115. NSManagedObjectContext *tmpContext = self.operationsMOC;
  116. [tmpContext performBlock:^{
  117. if (block){
  118. block(tmpContext);
  119. }
  120.  
  121. NSError *error = [NSError new];
  122. if (![tmpContext save:&error])
  123. {
  124. //handle error
  125. NSLog(@"context saved in childContext- ❌. Error is -> %@",error.localizedDescription);
  126. }else{
  127. [self.defaultMOC performBlock:^{
  128. NSError *error = [NSError new];
  129. if ([self.defaultMOC save:&error]) {
  130. NSLog(@"context saved -> ✅");
  131. }else{
  132. NSLog(@"context saved - ❌. Error is -> %@",error.localizedDescription);
  133. }
  134. }];
  135. }
  136. }];
  137. }];
  138.  
  139. [saveOperation setCompletionBlock:^{
  140.  
  141. }];
  142.  
  143. [self.dataBaseOperationsQueue addOperation:saveOperation];
  144. }
  145.  
  146. -(void)deleteObject:(NSManagedObject *)object fromContext:(NSManagedObjectContext *)context{
  147. if ([object isKindOfClass:[NSManagedObject class]]) {
  148. // if ([context objectWithID:object.objectID]) {
  149. [context deleteObject:[context objectWithID:object.objectID]];
  150. // }
  151. }
  152. NSError *error = [NSError new];
  153.  
  154. if ([context save:&error]) {
  155. NSLog(@"context saved -> ✅");
  156. }else{
  157. NSLog(@"context saved - ❌. Error is -> %@",error.localizedDescription);
  158. }
  159.  
  160. }
  161.  
  162. - (void)saveToPersistentStore {
  163. NSError *error = [NSError new];
  164. if ([self.defaultMOC save:&error]) {
  165. NSLog(@"context saved before App close");
  166. }else{
  167. NSLog(@"context wasn't save. Error is -> %@",error.localizedDescription);
  168. }
  169. }
  170.  
  171. - (void)endWork {
  172. [self saveToPersistentStore];
  173. }
  174.  
  175. #pragma mark - Properties
  176.  
  177. - (NSURL *)applicationDocumentsDirectory {
  178. // The directory the application uses to store the Core Data store file. This code uses a directory named "com.makopyants.aurorafiles" in the application's documents directory.
  179. return [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.afterlogic.aurorafiles"];
  180. // return [[NSFileManager defaultManager] ]
  181. }
  182.  
  183.  
  184. - (NSManagedObjectModel *)managedObjectModel {
  185. // The managed object model for the application. It is a fatal error for the application not to be able to find and load its model.
  186. if (_managedObjectModel != nil) {
  187. return _managedObjectModel;
  188. }
  189. NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"aurorafiles" withExtension:@"momd"];
  190. _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
  191. return _managedObjectModel;
  192. }
  193.  
  194. - (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
  195. // The persistent store coordinator for the application. This implementation creates and returns a coordinator, having added the store for the application to it.
  196. if (_persistentStoreCoordinator != nil) {
  197. return _persistentStoreCoordinator;
  198. }
  199. // Create the coordinator and store
  200. _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
  201. NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"aurorafiles.sqlite"];
  202. NSError *error = nil;
  203. NSString *failureReason = @"There was an error creating or loading the application's saved data.";
  204. if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:@{NSMigratePersistentStoresAutomaticallyOption:[NSNumber numberWithBool:YES],NSInferMappingModelAutomaticallyOption:[NSNumber numberWithBool:YES]} error:&error]) {
  205. // Report any error we got.
  206. NSMutableDictionary *dict = [NSMutableDictionary dictionary];
  207. dict[NSLocalizedDescriptionKey] = @"Failed to initialize the application's saved data";
  208. dict[NSLocalizedFailureReasonErrorKey] = failureReason;
  209. dict[NSUnderlyingErrorKey] = error;
  210. error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict];
  211. // Replace this with code to handle the error appropriately.
  212. // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
  213. NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
  214. }
  215.  
  216. return _persistentStoreCoordinator;
  217. }
  218.  
  219. - (NSManagedObjectContext *)defaultMOC {
  220. // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.)
  221. if (_defaultMOC != nil) {
  222. return _defaultMOC;
  223. }
  224.  
  225. NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
  226. if (!coordinator) {
  227. return nil;
  228. }
  229.  
  230. _defaultMOC = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
  231. [_defaultMOC setPersistentStoreCoordinator:coordinator];
  232. [_defaultMOC setName:@"DefaultMOC"];
  233. return _defaultMOC;
  234. }
  235.  
  236. - (NSManagedObjectContext *)operationsMOC {
  237.  
  238. NSManagedObjectContext *operationsContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
  239. [operationsContext setParentContext:_defaultMOC];
  240. [operationsContext setName:@"TemporaryMOC"];
  241. return operationsContext;
  242. }
  243.  
  244.  
  245. #pragma mark - Debug
  246. -(void)removeAll{
  247. NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Folder"];
  248. [request setIncludesPropertyValues:NO];
  249. NSError *fetchError = [NSError new];
  250. NSArray * result = [_defaultMOC executeFetchRequest:request error:&fetchError];
  251. [self saveWithBlock:^(NSManagedObjectContext *context) {
  252. for (NSManagedObject *object in result) {
  253. [_defaultMOC deleteObject:object];
  254. }
  255. }];
  256.  
  257. // NSBatchDeleteRequest *delete = [[NSBatchDeleteRequest alloc] initWithFetchRequest:request];
  258. // NSError *deleteError = nil;
  259. // [_persistentStoreCoordinator executeRequest:delete withContext:_defaultMOC error:&deleteError];
  260. }
  261.  
  262. @end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement