diff --git a/Nimble.podspec b/Nimble.podspec index f0b2c6c..6e0138a 100644 --- a/Nimble.podspec +++ b/Nimble.podspec @@ -1,13 +1,13 @@ Pod::Spec.new do |s| s.name = "Nimble" - s.version = "0.0.1" + s.version = "0.0.2" s.summary = "Core Data and iCloud made nimble and fast." s.homepage = "http://github.com/marcosero/Nimble" s.license = 'MIT' s.author = { "Marco Sero" => "marco@marcosero.com" } - s.source = { :git => "http://github.com/marcosero/Nimble", :tag => "0.0.1" } + s.source = { :git => "https://github.com/xhzengAIB/Nimble.git"} s.platform = :ios, '6.0' - s.source_files = 'Nimble' + s.source_files = 'Nimble/*.{h,m}','Nimble/**/*.{h,m}' s.framework = 'CoreData' s.requires_arc = true end diff --git a/Nimble/Categories/NimbleStore+Savers.h b/Nimble/Categories/NimbleStore+Savers.h index 9667053..32e6f4c 100644 --- a/Nimble/Categories/NimbleStore+Savers.h +++ b/Nimble/Categories/NimbleStore+Savers.h @@ -28,8 +28,11 @@ + (void)nb_saveInMain:(NimbleSimpleBlock)changes; ++ (void)nb_saveInMain:(NimbleSimpleBlock)changes withMergePolicy:(NSMergePolicy *)mergePolicy; + + (void)nb_saveInMainWaiting:(NimbleSimpleBlock)changes; ++ (void)nb_saveInMainWaiting:(NimbleSimpleBlock)changes withMergePolicy:(NSMergePolicy *)mergePolicy; /** * Perform all the changes in a background queue and then merge everything into the main context @@ -45,4 +48,6 @@ */ + (void)nb_saveInBackground:(NimbleSimpleBlock)changes completion:(NimbleErrorBlock)completion; ++ (void)nb_saveInBackground:(NimbleSimpleBlock)changes withMergePolicy:(NSMergePolicy *)mergePolicy completion:(NimbleErrorBlock)completion; + @end \ No newline at end of file diff --git a/Nimble/Categories/NimbleStore+Savers.m b/Nimble/Categories/NimbleStore+Savers.m index bb93fc1..c811a1c 100644 --- a/Nimble/Categories/NimbleStore+Savers.m +++ b/Nimble/Categories/NimbleStore+Savers.m @@ -29,43 +29,62 @@ @implementation NimbleStore (Savers) + (void)nb_saveInMain:(NimbleSimpleBlock)changes { - NSParameterAssert(changes); - - NSManagedObjectContext *context = [NSManagedObjectContext nb_mainContext]; - - [context performBlock:^{ - - changes(NBMainContext); - - NSError *error; - [context save:&error]; - - if (error) { - NBLog(@"Error saving main context: %@", error); - } + [self nb_saveInMain:changes withMergePolicy:NSErrorMergePolicy]; +} - }]; ++ (void)nb_saveInMain:(NimbleSimpleBlock)changes withMergePolicy:(NSMergePolicy *)mergePolicy +{ + NSParameterAssert(changes); + + NSManagedObjectContext *context = [NSManagedObjectContext nb_mainContext]; + + [context performBlock:^{ + NSMergePolicy *originalMergePolicy = context.mergePolicy; + context.mergePolicy = mergePolicy; + + changes(NBMainContext); + + NSError *error; + [context save:&error]; + + context.mergePolicy = originalMergePolicy; + if (error) { + NBLog(@"Error saving main context: %@", error); + } + + }]; } + (void)nb_saveInMainWaiting:(NimbleSimpleBlock)changes { - NSParameterAssert(changes); - - NSManagedObjectContext *context = [NSManagedObjectContext nb_mainContext]; - - [context performBlockAndWait:^{ - - changes(NBMainContext); + [self nb_saveInMainWaiting:changes withMergePolicy:NSErrorMergePolicy]; +} - NSError *error; - [context save:&error]; ++ (void)nb_saveInMainWaiting:(NimbleSimpleBlock)changes withMergePolicy:(NSMergePolicy *)mergePolicy +{ + NSParameterAssert(changes); + + NSManagedObjectContext *context = [NSManagedObjectContext nb_mainContext]; + + [context performBlockAndWait:^{ + + NSMergePolicy *originalMergePolicy = context.mergePolicy; + context.mergePolicy = mergePolicy; + + changes(NBMainContext); + + NSError *error; + [context save:&error]; + + context.mergePolicy = originalMergePolicy; + if (error) { + NBLog(@"Error saving main context: %@", error); + } + + }]; +} - if (error) { - NBLog(@"Error saving main context: %@", error); - } - }]; -} + (void)nb_saveInBackground:(NimbleSimpleBlock)changes { @@ -74,30 +93,36 @@ + (void)nb_saveInBackground:(NimbleSimpleBlock)changes + (void)nb_saveInBackground:(NimbleSimpleBlock)changes completion:(NimbleErrorBlock)completion { - NSParameterAssert(changes); - - NSManagedObjectContext *backgroundContext = [NSManagedObjectContext nb_backgroundContext]; - - [backgroundContext performBlock:^{ - - changes(NBBackgroundContext); - - NSError *error; - [backgroundContext save:&error]; - - if (error) { - NBLog(@"Error saving background context: %@", error); - } - - if (completion) { - dispatch_async(dispatch_get_main_queue(), ^{ - completion(nil); - }); - } - - }]; - + [self nb_saveInBackground:changes withMergePolicy:NSErrorMergePolicy completion:completion]; } ++ (void)nb_saveInBackground:(NimbleSimpleBlock)changes withMergePolicy:(NSMergePolicy *)mergePolicy completion:(NimbleErrorBlock)completion { + NSParameterAssert(changes); + + NSManagedObjectContext *backgroundContext = [NSManagedObjectContext nb_backgroundContext]; + + [backgroundContext performBlock:^{ + + NSMergePolicy *originalMergePolicy = backgroundContext.mergePolicy; + backgroundContext.mergePolicy = mergePolicy; + + changes(NBBackgroundContext); + + NSError *error; + [backgroundContext save:&error]; + + backgroundContext.mergePolicy = originalMergePolicy; + if (error) { + NBLog(@"Error saving background context: %@", error); + } + + if (completion) { + dispatch_async(dispatch_get_main_queue(), ^{ + completion(nil); + }); + } + + }]; +} @end \ No newline at end of file diff --git a/Nimble/Main Store/NimbleStore.h b/Nimble/Main Store/NimbleStore.h index 8039e19..962b9da 100644 --- a/Nimble/Main Store/NimbleStore.h +++ b/Nimble/Main Store/NimbleStore.h @@ -22,6 +22,7 @@ #import +#import #define NBLog(...) NSLog(@"Nimble >> %s\n\t%@", __PRETTY_FUNCTION__, [NSString stringWithFormat:__VA_ARGS__]) @@ -67,6 +68,16 @@ typedef void (^NimbleErrorBlock)(NSError *error); */ + (BOOL)nb_setupStore:(NSError **)error; + +/** + * Setup a autoMigrating store with the default filename + * + * @param error + * + * @return setup status + */ ++ (BOOL)nb_setupAutoMigratingSqliteStore:(NSError **)error; + /** Setup a store with a custom filename */ diff --git a/Nimble/Main Store/NimbleStore.m b/Nimble/Main Store/NimbleStore.m index ebf5643..d73e629 100644 --- a/Nimble/Main Store/NimbleStore.m +++ b/Nimble/Main Store/NimbleStore.m @@ -53,6 +53,14 @@ + (BOOL)nb_setupStore:(NSError **)error return [self nb_setupStoreWithFilename:[self.class nb_defaultStoreName] error:error]; } ++ (BOOL)nb_setupAutoMigratingSqliteStore:(NSError **)error +{ + NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: + [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, + [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; + return [self nb_setupStoreWithName:[self.class nb_defaultStoreName] storeType:NSSQLiteStoreType options:options error:error]; +} + + (BOOL)nb_setupStoreWithFilename:(NSString *)filename error:(NSError **)error { NSParameterAssert(filename); diff --git a/NimbleDemo.xcodeproj/project.xcworkspace/xcshareddata/NimbleDemo.xccheckout b/NimbleDemo.xcodeproj/project.xcworkspace/xcshareddata/NimbleDemo.xccheckout index 02b9981..d900ef9 100644 --- a/NimbleDemo.xcodeproj/project.xcworkspace/xcshareddata/NimbleDemo.xccheckout +++ b/NimbleDemo.xcodeproj/project.xcworkspace/xcshareddata/NimbleDemo.xccheckout @@ -2,35 +2,37 @@ + IDESourceControlProjectFavoriteDictionaryKey + IDESourceControlProjectIdentifier - DB398F12-C64F-4246-A5E1-C0092C32F193 + 83E05706-1C71-40B6-9C58-5C9CBE62AEEE IDESourceControlProjectName NimbleDemo IDESourceControlProjectOriginsDictionary - 29CB7ABD-0461-41C6-803C-14162FDA686B - ssh://bitbucket.org/marcosero/nimble.git + D774E5F0-7D41-4628-AEC0-CE3CDEB9096A + https://github.com/xhzengAIB/Nimble.git IDESourceControlProjectPath NimbleDemo.xcodeproj/project.xcworkspace IDESourceControlProjectRelativeInstallPathDictionary - 29CB7ABD-0461-41C6-803C-14162FDA686B + D774E5F0-7D41-4628-AEC0-CE3CDEB9096A ../.. IDESourceControlProjectURL - ssh://bitbucket.org/marcosero/nimble.git + https://github.com/xhzengAIB/Nimble.git IDESourceControlProjectVersion 110 IDESourceControlProjectWCCIdentifier - 29CB7ABD-0461-41C6-803C-14162FDA686B + D774E5F0-7D41-4628-AEC0-CE3CDEB9096A IDESourceControlProjectWCConfigurations IDESourceControlRepositoryExtensionIdentifierKey public.vcs.git IDESourceControlWCCIdentifierKey - 29CB7ABD-0461-41C6-803C-14162FDA686B + D774E5F0-7D41-4628-AEC0-CE3CDEB9096A IDESourceControlWCCName Nimble diff --git a/NimbleDemo.xcodeproj/project.xcworkspace/xcuserdata/dw_ios.xcuserdatad/UserInterfaceState.xcuserstate b/NimbleDemo.xcodeproj/project.xcworkspace/xcuserdata/dw_ios.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000..b502ad2 Binary files /dev/null and b/NimbleDemo.xcodeproj/project.xcworkspace/xcuserdata/dw_ios.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/NimbleDemo.xcodeproj/xcuserdata/dw_ios.xcuserdatad/xcschemes/NimbleDemo.xcscheme b/NimbleDemo.xcodeproj/xcuserdata/dw_ios.xcuserdatad/xcschemes/NimbleDemo.xcscheme new file mode 100644 index 0000000..f42578f --- /dev/null +++ b/NimbleDemo.xcodeproj/xcuserdata/dw_ios.xcuserdatad/xcschemes/NimbleDemo.xcscheme @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/NimbleDemo.xcodeproj/xcuserdata/dw_ios.xcuserdatad/xcschemes/xcschememanagement.plist b/NimbleDemo.xcodeproj/xcuserdata/dw_ios.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..66afade --- /dev/null +++ b/NimbleDemo.xcodeproj/xcuserdata/dw_ios.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,27 @@ + + + + + SchemeUserState + + NimbleDemo.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + A9040B5A178E0ECC00CCE8EF + + primary + + + A9541F181793572A008D92FC + + primary + + + + +