mirror of
https://github.com/zhigang1992/MagicalRecord.git
synced 2026-01-12 17:32:18 +08:00
Trying to solve deadlock problems when checking for iCloud availability.
This commit is contained in:
@@ -9,7 +9,7 @@
|
||||
#import <objc/runtime.h>
|
||||
|
||||
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];
|
||||
}];
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user