From 7685eab7d23d2176c73c2a038bd55bf3e45f7301 Mon Sep 17 00:00:00 2001 From: Andrea Cremaschi Date: Mon, 15 Sep 2014 10:47:59 +0200 Subject: [PATCH] handle validation issues while importing new records on background thread --- Source/MMRecord/MMRecord.m | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Source/MMRecord/MMRecord.m b/Source/MMRecord/MMRecord.m index 10948ff..3061a88 100644 --- a/Source/MMRecord/MMRecord.m +++ b/Source/MMRecord/MMRecord.m @@ -32,6 +32,8 @@ #import "FBMMRecordTweakModel.h" #endif +#import + static dispatch_group_t _mmrecord_request_group = nil; static dispatch_semaphore_t _mmrecord_request_semaphore = nil; static BOOL _mmrecord_batch_requests = NO; @@ -87,6 +89,8 @@ + (MMRecordRequestState *)requestStateForURN:(NSString*)URN // `NSEntityDescription` object for a given class name. @interface NSManagedObjectContext (MMRecord) +@property BOOL shouldSkipValidation; + - (void)MMRecord_startObservingWithContext:(NSManagedObjectContext*)context; - (void)MMRecord_stopObservingWithContext:(NSManagedObjectContext*)context; - (NSEntityDescription*)MMRecord_entityForClass:(Class)managedObjectClass; @@ -349,6 +353,7 @@ + (void)configureBackgroundContext:(NSManagedObjectContext *)backgroundContext if (options.automaticallyPersistsRecords == NO) { if ([backgroundContext respondsToSelector:@selector(setParentContext:)]) { [backgroundContext setParentContext:mainContext]; + backgroundContext.shouldSkipValidation = YES; } } else { [backgroundContext setPersistentStoreCoordinator:mainStoreCoordinator]; @@ -685,6 +690,10 @@ + (BOOL)validateSetUpForStartRequest { return YES; } +-(BOOL)validateValue:(__autoreleasing id *)value forKey:(NSString *)key error:(NSError *__autoreleasing *)error { + if (self.managedObjectContext.shouldSkipValidation) return YES; + return [super validateValue:value forKey:key error:error]; +} #pragma mark - Parsing Helper Methods @@ -1048,6 +1057,16 @@ - (NSEntityDescription *)MMRecord_entityForClass:(Class)managedObjectClass { return nil; } +#pragma mark - Skip validation on working context + +-(BOOL)shouldSkipValidation { + return [objc_getAssociatedObject(self, @selector(shouldSkipValidation)) boolValue]; +} + +-(void)setShouldSkipValidation:(BOOL)shouldSkipValidation { + objc_setAssociatedObject(self, @selector(shouldSkipValidation), @(shouldSkipValidation), OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + @end