From 3d37bdb1e6569930b186fac2b9e87d6020c77f75 Mon Sep 17 00:00:00 2001 From: Magical Panda Software Date: Fri, 27 Apr 2012 13:09:14 -0600 Subject: [PATCH] Trying to solve deadlock problems when checking for iCloud availability. --- .../NSManagedObjectContext+MagicalRecord.m | 29 ++++++++++++------- ...PersistentStoreCoordinator+MagicalRecord.m | 10 ++++++- MagicalRecord/Core/MagicalRecord+iCloud.m | 13 +++++++-- 3 files changed, 38 insertions(+), 14 deletions(-) diff --git a/MagicalRecord/Categories/NSManagedObjectContext/NSManagedObjectContext+MagicalRecord.m b/MagicalRecord/Categories/NSManagedObjectContext/NSManagedObjectContext+MagicalRecord.m index d88cd74..2e9bfcb 100644 --- a/MagicalRecord/Categories/NSManagedObjectContext/NSManagedObjectContext+MagicalRecord.m +++ b/MagicalRecord/Categories/NSManagedObjectContext/NSManagedObjectContext+MagicalRecord.m @@ -9,7 +9,7 @@ #import static NSManagedObjectContext *rootSavingContext = nil; -static NSManagedObjectContext *defaultManageObjectContext_ = nil; +static NSManagedObjectContext *defaultManagedObjectContext_ = nil; @interface NSManagedObjectContext (MagicalRecordInternal) @@ -32,7 +32,7 @@ static NSManagedObjectContext *defaultManageObjectContext_ = nil; - (NSString *) MR_description; { - NSString *contextName = (self == defaultManageObjectContext_) ? @"*** DEFAULT ***" : @""; + NSString *contextName = (self == defaultManagedObjectContext_) ? @"*** DEFAULT ***" : @""; contextName = (self == rootSavingContext) ? @"*** BACKGROUND SAVE ***" : contextName; NSString *onMainThread = [NSThread isMainThread] ? @"*** MAIN THREAD ***" : @""; @@ -44,8 +44,8 @@ static NSManagedObjectContext *defaultManageObjectContext_ = nil; { @synchronized (self) { - NSAssert(defaultManageObjectContext_ != nil, @"Default Context is nil! Did you forget to initialize the Core Data Stack?"); - return defaultManageObjectContext_; + NSAssert(defaultManagedObjectContext_ != nil, @"Default Context is nil! Did you forget to initialize the Core Data Stack?"); + return defaultManagedObjectContext_; } } @@ -54,14 +54,14 @@ static NSManagedObjectContext *defaultManageObjectContext_ = nil; NSPersistentStoreCoordinator *coordinator = [NSPersistentStoreCoordinator MR_defaultStoreCoordinator]; if ([MagicalRecord isICloudEnabled]) { - [defaultManageObjectContext_ MR_stopObservingiCloudChangesInCoordinator:coordinator]; + [defaultManagedObjectContext_ MR_stopObservingiCloudChangesInCoordinator:coordinator]; } - defaultManageObjectContext_ = moc; + defaultManagedObjectContext_ = moc; if ([MagicalRecord isICloudEnabled]) { - [defaultManageObjectContext_ MR_observeiCloudChangesInCoordinator:coordinator]; + [defaultManagedObjectContext_ MR_observeiCloudChangesInCoordinator:coordinator]; } } @@ -77,7 +77,7 @@ static NSManagedObjectContext *defaultManageObjectContext_ = nil; + (void) MR_initializeDefaultContextWithCoordinator:(NSPersistentStoreCoordinator *)coordinator; { - if (defaultManageObjectContext_ == nil) + if (defaultManagedObjectContext_ == nil) { NSManagedObjectContext *rootContext = [self MR_contextWithStoreCoordinator:coordinator]; @@ -99,15 +99,22 @@ static NSManagedObjectContext *defaultManageObjectContext_ = nil; dispatch_async(dispatch_get_main_queue(), resetBlock); } -+ (NSManagedObjectContext *) MR_context; ++ (NSManagedObjectContext *) MR_contextWithoutParent; { NSManagedObjectContext *context = [[self alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; return context; } ++ (NSManagedObjectContext *) MR_context; +{ + NSManagedObjectContext *context = [[self alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; + [context setParentContext:[self MR_defaultContext]]; + return context; +} + + (NSManagedObjectContext *) MR_contextWithParent:(NSManagedObjectContext *)parentContext; { - NSManagedObjectContext *context = [self MR_context]; + NSManagedObjectContext *context = [self MR_contextWithoutParent]; [context setParentContext:parentContext]; return context; } @@ -131,7 +138,7 @@ static NSManagedObjectContext *defaultManageObjectContext_ = nil; NSManagedObjectContext *context = nil; if (coordinator != nil) { - context = [self MR_context]; + context = [self MR_contextWithoutParent]; [context performBlockAndWait:^{ [context setPersistentStoreCoordinator:coordinator]; }]; diff --git a/MagicalRecord/Categories/NSPersistentStoreCoordinator+MagicalRecord.m b/MagicalRecord/Categories/NSPersistentStoreCoordinator+MagicalRecord.m index 166ec71..cafd0c9 100644 --- a/MagicalRecord/Categories/NSPersistentStoreCoordinator+MagicalRecord.m +++ b/MagicalRecord/Categories/NSPersistentStoreCoordinator+MagicalRecord.m @@ -16,6 +16,12 @@ NSString * const kMagicalRecordPSCDidCompleteiCloudSetupNotification = @"kMagica @end +@interface MagicalRecord (iCloudPrivate) + ++ (void) setICloudEnabled:(BOOL)enabled; + +@end + @implementation NSPersistentStoreCoordinator (MagicalRecord) + (NSPersistentStoreCoordinator *) MR_defaultStoreCoordinator @@ -164,6 +170,8 @@ NSString * const kMagicalRecordPSCDidCompleteiCloudSetupNotification = @"kMagica cloudURL = [cloudURL URLByAppendingPathComponent:subPathComponent]; } + [MagicalRecord setICloudEnabled:cloudURL != nil]; + NSDictionary *options = [[self class] MR_autoMigrationOptions]; if (cloudURL) //iCloud is available { @@ -180,7 +188,7 @@ NSString * const kMagicalRecordPSCDidCompleteiCloudSetupNotification = @"kMagica [self lock]; [self MR_addSqliteStoreNamed:localStoreName withOptions:options]; [self unlock]; - + dispatch_async(dispatch_get_main_queue(), ^{ if ([NSPersistentStore MR_defaultPersistentStore] == nil) { diff --git a/MagicalRecord/Core/MagicalRecord+iCloud.m b/MagicalRecord/Core/MagicalRecord+iCloud.m index 623aab9..9cb2e85 100644 --- a/MagicalRecord/Core/MagicalRecord+iCloud.m +++ b/MagicalRecord/Core/MagicalRecord+iCloud.m @@ -8,14 +8,23 @@ #import "MagicalRecord+iCloud.h" +static BOOL _iCloudEnabled = NO; + @implementation MagicalRecord (iCloud) #pragma mark - iCloud Methods + (BOOL) isICloudEnabled; { - NSURL *cloudURL = [NSPersistentStore MR_cloudURLForUbiqutiousContainer:nil]; - return cloudURL != nil; + return _iCloudEnabled; +} + ++ (void) setICloudEnabled:(BOOL)enabled; +{ + @synchronized(self) + { + _iCloudEnabled = enabled; + } } + (void) setupCoreDataStackWithiCloudContainer:(NSString *)icloudBucket localStoreNamed:(NSString *)localStore;