@@ -9,9 +9,7 @@
#import <objc/runtime.h>

static NSManagedObjectContext *defaultManageObjectContext_ = nil;
static NSString const * kMagicalRecordManagedObjectContextKey = @"MagicalRecord_NSManagedObjectContextForThreadKey";
static void const * kMagicalRecordNotifiesMainContextAssociatedValueKey = @"kMagicalRecordNotifiesMainContextOnSave";
NSString * const kMagicalRecordDidMergeChangesFromiCloudNotification = @"kMagicalRecordDidMergeChangesFromiCloudNotification";


@interface NSManagedObjectContext (MagicalRecordInternal)

@@ -56,250 +54,40 @@ + (void)MR_resetDefaultContext
dispatch_async(dispatch_get_main_queue(), resetBlock);
}

+ (void)MR_resetContextForCurrentThread
{
[[NSManagedObjectContext MR_contextForCurrentThread] reset];
}

#pragma mark - Context Observation Helpers

- (void) MR_observeContext:(NSManagedObjectContext *)otherContext
{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(MR_mergeChangesFromNotification:)
name:NSManagedObjectContextDidSaveNotification
object:otherContext];
}

- (void) MR_observeContextOnMainThread:(NSManagedObjectContext *)otherContext
{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(MR_mergeChangesOnMainThread:)
name:NSManagedObjectContextDidSaveNotification
object:otherContext];
}

- (void) MR_stopObservingContext:(NSManagedObjectContext *)otherContext
{
[[NSNotificationCenter defaultCenter] removeObserver:self
name:NSManagedObjectContextDidSaveNotification
object:otherContext];
}

#pragma mark - Context iCloud Merge Helpers

- (void) MR_observeiCloudChangesInCoordinator:(NSPersistentStoreCoordinator *)coordinator;
{
if (![MagicalRecordHelpers isICloudEnabled]) return;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(MR_mergeChangesFromiCloud:)
name:NSPersistentStoreDidImportUbiquitousContentChangesNotification
object:coordinator];

}

- (void) MR_stopObservingiCloudChangesInCoordinator:(NSPersistentStoreCoordinator *)coordinator;
{
if (![MagicalRecordHelpers isICloudEnabled]) return;
[[NSNotificationCenter defaultCenter] removeObserver:self
name:NSPersistentStoreDidImportUbiquitousContentChangesNotification
object:coordinator];
}

- (void) MR_mergeChangesFromiCloud:(NSNotification *)notification;
{
[self performBlock:^{

MRLog(@"Merging changes From iCloud %@context%@",
self == [NSManagedObjectContext MR_defaultContext] ? @"*** DEFAULT *** " : @"",
([NSThread isMainThread] ? @" *** on Main Thread ***" : @""));

[self mergeChangesFromContextDidSaveNotification:notification];

[[NSNotificationCenter defaultCenter] postNotificationName:kMagicalRecordDidMergeChangesFromiCloudNotification
object:self
userInfo:[notification userInfo]];
}];
}

- (void) MR_mergeChangesFromNotification:(NSNotification *)notification;
{
MRLog(@"Merging changes to %@context%@",
self == [NSManagedObjectContext MR_defaultContext] ? @"*** DEFAULT *** " : @"",
([NSThread isMainThread] ? @" *** on Main Thread ***" : @""));

[self mergeChangesFromContextDidSaveNotification:notification];
}

- (void) MR_mergeChangesOnMainThread:(NSNotification *)notification;
{
if ([NSThread isMainThread])
{
[self MR_mergeChangesFromNotification:notification];
}
else
{
[self performSelectorOnMainThread:@selector(MR_mergeChangesFromNotification:) withObject:notification waitUntilDone:YES];
}
}

- (void) MR_observeiCloudChangesInCoordinator:(NSPersistentStoreCoordinator *)coordinator;
{
if (![MagicalRecord isICloudEnabled]) return;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(MR_mergeChangesFromiCloud:)
name:NSPersistentStoreDidImportUbiquitousContentChangesNotification
object:coordinator];

}

- (void) MR_stopObservingiCloudChangesInCoordinator:(NSPersistentStoreCoordinator *)coordinator;
{
if (![MagicalRecord isICloudEnabled]) return;
[[NSNotificationCenter defaultCenter] removeObserver:self
name:NSPersistentStoreDidImportUbiquitousContentChangesNotification
object:coordinator];
}

#pragma mark - Save Helpers

- (BOOL) MR_saveNestedContexts:(BOOL)saveParents errorHandler:(void(^)(NSError *))errorCallback;
+ (NSManagedObjectContext *) MR_context;
{
__block NSError *error = nil;
__block BOOL saved = NO;

@try
{
[self performBlockAndWait:^{
MRLog(@"Saving %@Context%@",
self == [[self class] MR_defaultContext] ? @" *** Default *** ": @"",
([NSThread isMainThread] ? @" *** on Main Thread ***" : @""));

saved = [self save:&error];
}];
}
@catch (NSException *exception)
{
MRLog(@"Problem saving: %@", (id)[exception userInfo] ?: (id)[exception reason]);
}
@finally
{
NSManagedObjectContext *parentContext = [self respondsToSelector:@selector(parentContext)] ? [self performSelector:@selector(parentContext)] : nil;
if (saved && parentContext != nil)
{
return saved && [parentContext MR_saveWithErrorHandler:errorCallback];
}
if (!saved)
{
[MagicalRecordHelpers handleErrors:error callback:errorCallback];
}
return saved;
}
NSManagedObjectContext *context = [[self alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
return context;
}

- (BOOL) MR_saveNestedContextsErrorHandler:(void (^)(NSError *))errorCallback;
+ (void) MR_initializeDefaultContextWithCoordinator:(NSPersistentStoreCoordinator *)coordinator;
{
@autoreleasepool
if ([self MR_defaultContext] == nil)
{
[self MR_save];
}
}

- (BOOL) MR_saveWithErrorHandler:(void (^)(NSError *))errorCallback;
{
return [self MR_saveNestedContexts:NO errorHandler:errorCallback];
}
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];

- (BOOL) MR_save;
{
return [self MR_saveNestedContexts:NO errorHandler:nil];
}

#pragma mark - Threading Helpers

- (BOOL) MR_saveOnBackgroundThread;
{
[self performSelectorInBackground:@selector(MR_save) withObject:nil];

return YES;
}

- (BOOL) MR_saveOnMainThread;
{
@synchronized(self)
{
[self performSelectorOnMainThread:@selector(MR_save) withObject:nil waitUntilDone:YES];
}

return YES;
}

- (BOOL) MR_notifiesMainContextOnSave;
{
return [self parentContext] == [[self class] MR_defaultContext];
}
[context performBlockAndWait:^{
[context setPersistentStoreCoordinator:coordinator];
}];

+ (NSManagedObjectContext *) MR_context;
{
NSManagedObjectContext *mainContext = [[self class] MR_defaultContext];
if (self != mainContext)
{
if (enabled)
{
[self setParentContext:mainContext];
}
[self MR_setDefaultContext:context];
}
}

+ (NSManagedObjectContext *) MR_contextForCurrentThread;
{
if ([NSThread isMainThread])
{
return [self MR_defaultContext];
}
else
{
NSMutableDictionary *threadDict = [[NSThread currentThread] threadDictionary];
NSManagedObjectContext *threadContext = [threadDict objectForKey:kMagicalRecordManagedObjectContextKey];
if (threadContext == nil)
{
threadContext = [self MR_contextThatNotifiesDefaultContextOnMainThread];
[threadDict setObject:threadContext forKey:kMagicalRecordManagedObjectContextKey];
}
return threadContext;
}
}

+ (NSManagedObjectContext *) MR_contextWithStoreCoordinator:(NSPersistentStoreCoordinator *)coordinator;
{
NSManagedObjectContext *context = nil;
if (coordinator != nil)
{
MRLog(@"Creating MOContext %@", [NSThread isMainThread] ? @" *** On Main Thread ***" : @"");

context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
context = [self MR_context];
[context performBlockAndWait:^{
[context setPersistentStoreCoordinator:coordinator];
}];
}
return context;
}

+ (NSManagedObjectContext *) MR_contextThatNotifiesDefaultContextOnMainThreadWithCoordinator:(NSPersistentStoreCoordinator *)coordinator;
{
NSManagedObjectContext *context = [self MR_contextWithStoreCoordinator:coordinator];
MRLog(@"Creating new context");
return context;
}

+ (NSManagedObjectContext *) MR_contextThatNotifiesDefaultContextOnMainThread;
{
NSManagedObjectContext *context = nil;

context = [[self alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
context.MR_notifiesMainContextOnSave = YES;

return context;
}

@end
@@ -0,0 +1,23 @@
//
// NSManagedObjectContext+MagicalSaves.h
// Magical Record
//
// Created by Saul Mora on 3/9/12.
// Copyright (c) 2012 Magical Panda Software LLC. All rights reserved.
//

#import <CoreData/CoreData.h>

@interface NSManagedObjectContext (MagicalSaves)

- (BOOL) MR_save;

#ifdef NS_BLOCKS_AVAILABLE
- (BOOL) MR_saveWithErrorHandler:(void (^)(NSError *))errorCallback;
#endif

- (BOOL) MR_saveOnMainThread;
- (BOOL) MR_saveOnBackgroundThread;


@end
@@ -0,0 +1,81 @@
//
// NSManagedObjectContext+MagicalSaves.m
// Magical Record
//
// Created by Saul Mora on 3/9/12.
// Copyright (c) 2012 Magical Panda Software LLC. All rights reserved.
//

#import "NSManagedObjectContext+MagicalSaves.h"

@implementation NSManagedObjectContext (MagicalSaves)

- (BOOL) MR_saveNestedContexts:(BOOL)saveParents errorHandler:(void(^)(NSError *))errorCallback;
{
__block NSError *error = nil;
__block BOOL saved = NO;

@try
{
[self performBlockAndWait:^{
MRLog(@"Saving %@Context%@",
self == [[self class] MR_defaultContext] ? @" *** Default *** ": @"",
([NSThread isMainThread] ? @" *** on Main Thread ***" : @""));

saved = [self save:&error];
}];
}
@catch (NSException *exception)
{
MRLog(@"Problem saving: %@", (id)[exception userInfo] ?: (id)[exception reason]);
}
@finally
{
NSManagedObjectContext *parentContext = [self parentContext];
if (saved && saveParents)
{
return saved && [parentContext MR_saveNestedContexts:saveParents errorHandler:errorCallback];
}
if (!saved)
{
[MagicalRecord handleErrors:error];
}
return saved;
}
}

- (BOOL) MR_saveNestedContextsErrorHandler:(void (^)(NSError *))errorCallback;
{
return [self MR_saveNestedContexts:YES errorHandler:errorCallback];
}

- (BOOL) MR_saveWithErrorHandler:(void (^)(NSError *))errorCallback;
{
return [self MR_saveNestedContexts:NO errorHandler:errorCallback];
}

- (BOOL) MR_save;
{
return [self MR_saveNestedContexts:NO errorHandler:nil];
}

#pragma mark - Threading Save Helpers

- (BOOL) MR_saveOnBackgroundThread;
{
[self performSelectorInBackground:@selector(MR_save) withObject:nil];

return YES;
}

- (BOOL) MR_saveOnMainThread;
{
@synchronized(self)
{
[self performSelectorOnMainThread:@selector(MR_save) withObject:nil waitUntilDone:YES];
}

return YES;
}

@end
@@ -0,0 +1,20 @@
//
// NSManagedObjectContext+MagicalThreading.h
// Magical Record
//
// Created by Saul Mora on 3/9/12.
// Copyright (c) 2012 Magical Panda Software LLC. All rights reserved.
//

#import <CoreData/CoreData.h>

@interface NSManagedObjectContext (MagicalThreading)

+ (NSManagedObjectContext *) MR_contextForCurrentThread;

+ (NSManagedObjectContext *) MR_contextThatNotifiesDefaultContextOnMainThread;
+ (NSManagedObjectContext *) MR_contextThatNotifiesDefaultContextOnMainThreadWithCoordinator:(NSPersistentStoreCoordinator *)coordinator;

+ (void) MR_resetContextForCurrentThread;

@end
@@ -0,0 +1,71 @@
//
// NSManagedObjectContext+MagicalThreading.m
// Magical Record
//
// Created by Saul Mora on 3/9/12.
// Copyright (c) 2012 Magical Panda Software LLC. All rights reserved.
//

#import "NSManagedObjectContext+MagicalThreading.h"

static NSString const * kMagicalRecordManagedObjectContextKey = @"MagicalRecord_NSManagedObjectContextForThreadKey";

@implementation NSManagedObjectContext (MagicalThreading)

+ (void)MR_resetContextForCurrentThread
{
[[NSManagedObjectContext MR_contextForCurrentThread] reset];
}

+ (NSManagedObjectContext *) MR_contextForCurrentThread;
{
if ([NSThread isMainThread])
{
return [self MR_defaultContext];
}
else
{
NSMutableDictionary *threadDict = [[NSThread currentThread] threadDictionary];
NSManagedObjectContext *threadContext = [threadDict objectForKey:kMagicalRecordManagedObjectContextKey];
if (threadContext == nil)
{
threadContext = [self MR_contextThatNotifiesDefaultContextOnMainThread];
[threadDict setObject:threadContext forKey:kMagicalRecordManagedObjectContextKey];
}
return threadContext;
}
}

+ (NSManagedObjectContext *) MR_contextThatNotifiesDefaultContextOnMainThreadWithCoordinator:(NSPersistentStoreCoordinator *)coordinator;
{
NSManagedObjectContext *context = [self MR_contextWithStoreCoordinator:coordinator];
MRLog(@"Creating new context");
return context;
}

+ (NSManagedObjectContext *) MR_contextThatNotifiesDefaultContextOnMainThread;
{
__block NSManagedObjectContext *(^findLastContext)(NSManagedObjectContext *) = nil;
findLastContext = ^NSManagedObjectContext *(NSManagedObjectContext *context)
{
if ([context parentContext] == nil)
{
return context;
}
return findLastContext([context parentContext]);
};

NSManagedObjectContext *defaultContext = [NSManagedObjectContext MR_defaultContext];
NSManagedObjectContext *lastContext = findLastContext(defaultContext);
NSManagedObjectContext *context = nil;

context = [[self alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];

[context setParentContext:lastContext];

MRLog(@"Created context %@: set %@ context as parent [defaultContext: %@]", context, lastContext, defaultContext);

return context;
}

@end
@@ -47,6 +47,9 @@
#import "NSManagedObject+MagicalFinders.h"
#import "NSManagedObject+MagicalAggregation.h"
#import "NSManagedObjectContext+MagicalRecord.h"
#import "NSManagedObjectContext+MagicalObserving.h"
#import "NSManagedObjectContext+MagicalSaves.h"
#import "NSManagedObjectContext+MagicalThreading.h"
#import "NSPersistentStoreCoordinator+MagicalRecord.h"
#import "NSManagedObjectModel+MagicalRecord.h"
#import "NSPersistentStore+MagicalRecord.h"
@@ -12,8 +12,7 @@ @implementation MagicalRecord (Setup)

+ (void) setupCoreDataStack
{
NSManagedObjectContext *context = [NSManagedObjectContext MR_context];
[NSManagedObjectContext MR_setDefaultContext:context];
[self setupCoreDataStackWithStoreNamed:[self defaultStoreName]];
}

+ (void) setupAutoMigratingCoreDataStack
@@ -23,29 +22,32 @@ + (void) setupAutoMigratingCoreDataStack

+ (void) setupCoreDataStackWithStoreNamed:(NSString *)storeName
{
if ([NSPersistentStoreCoordinator MR_defaultStoreCoordinator] != nil) return;

NSPersistentStoreCoordinator *coordinator = [NSPersistentStoreCoordinator MR_coordinatorWithSqliteStoreNamed:storeName];
[NSPersistentStoreCoordinator MR_setDefaultStoreCoordinator:coordinator];
[NSPersistentStoreCoordinator MR_setDefaultStoreCoordinator:coordinator];

NSManagedObjectContext *context = [NSManagedObjectContext MR_contextWithStoreCoordinator:coordinator];
[NSManagedObjectContext MR_setDefaultContext:context];
[NSManagedObjectContext MR_initializeDefaultContextWithCoordinator:coordinator];
}

+ (void) setupCoreDataStackWithAutoMigratingSqliteStoreNamed:(NSString *)storeName
{
if ([NSPersistentStoreCoordinator MR_defaultStoreCoordinator] != nil) return;

NSPersistentStoreCoordinator *coordinator = [NSPersistentStoreCoordinator MR_coordinatorWithAutoMigratingSqliteStoreNamed:storeName];
[NSPersistentStoreCoordinator MR_setDefaultStoreCoordinator:coordinator];

NSManagedObjectContext *context = [NSManagedObjectContext MR_contextWithStoreCoordinator:coordinator];
[NSManagedObjectContext MR_setDefaultContext:context];
[NSManagedObjectContext MR_initializeDefaultContextWithCoordinator:coordinator];
}

+ (void) setupCoreDataStackWithInMemoryStore;
{
if ([NSPersistentStoreCoordinator MR_defaultStoreCoordinator] != nil) return;

NSPersistentStoreCoordinator *coordinator = [NSPersistentStoreCoordinator MR_coordinatorWithInMemoryStore];
[NSPersistentStoreCoordinator MR_setDefaultStoreCoordinator:coordinator];

NSManagedObjectContext *context = [NSManagedObjectContext MR_contextWithStoreCoordinator:coordinator];
[NSManagedObjectContext MR_setDefaultContext:context];
[NSManagedObjectContext MR_initializeDefaultContextWithCoordinator:coordinator];
}

@end
@@ -82,7 +82,7 @@ + (void) initialize;
[self swizzleShorthandMethods];
#endif
[self setShouldAutoCreateManagedObjectModel:YES];
[self setShouldAutoCreateDefaultPersistentStoreCoordinator:YES];
[self setShouldAutoCreateDefaultPersistentStoreCoordinator:NO];
}
}

@@ -27,6 +27,12 @@
C70ED69A1507B8C300486B6F /* NSManagedObject+MagicalAggregation.m in Sources */ = {isa = PBXBuildFile; fileRef = C70ED6981507B8C200486B6F /* NSManagedObject+MagicalAggregation.m */; };
C70ED69D1507BBA500486B6F /* NSManagedObject+MagicalRequests.m in Sources */ = {isa = PBXBuildFile; fileRef = C70ED69C1507BBA400486B6F /* NSManagedObject+MagicalRequests.m */; };
C70ED69E1507BBA500486B6F /* NSManagedObject+MagicalRequests.m in Sources */ = {isa = PBXBuildFile; fileRef = C70ED69C1507BBA400486B6F /* NSManagedObject+MagicalRequests.m */; };
C71A6A06150A18200035A24D /* NSManagedObjectContext+MagicalObserving.m in Sources */ = {isa = PBXBuildFile; fileRef = C71A6A05150A18200035A24D /* NSManagedObjectContext+MagicalObserving.m */; };
C71A6A07150A18200035A24D /* NSManagedObjectContext+MagicalObserving.m in Sources */ = {isa = PBXBuildFile; fileRef = C71A6A05150A18200035A24D /* NSManagedObjectContext+MagicalObserving.m */; };
C71A6A0B150A18B70035A24D /* NSManagedObjectContext+MagicalSaves.m in Sources */ = {isa = PBXBuildFile; fileRef = C71A6A0A150A18B70035A24D /* NSManagedObjectContext+MagicalSaves.m */; };
C71A6A0C150A18B70035A24D /* NSManagedObjectContext+MagicalSaves.m in Sources */ = {isa = PBXBuildFile; fileRef = C71A6A0A150A18B70035A24D /* NSManagedObjectContext+MagicalSaves.m */; };
C71A6A0F150A194A0035A24D /* NSManagedObjectContext+MagicalThreading.m in Sources */ = {isa = PBXBuildFile; fileRef = C71A6A0E150A194A0035A24D /* NSManagedObjectContext+MagicalThreading.m */; };
C71A6A10150A194A0035A24D /* NSManagedObjectContext+MagicalThreading.m in Sources */ = {isa = PBXBuildFile; fileRef = C71A6A0E150A194A0035A24D /* NSManagedObjectContext+MagicalThreading.m */; };
C721C7DF13D0C3A00097AB6F /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C721C7DE13D0C3A00097AB6F /* Cocoa.framework */; };
C721C7E913D0C3A00097AB6F /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = C721C7E713D0C3A00097AB6F /* InfoPlist.strings */; };
C721C7EF13D0C3A00097AB6F /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = C721C7ED13D0C3A00097AB6F /* Credits.rtf */; };
@@ -250,6 +256,12 @@
C70ED6981507B8C200486B6F /* NSManagedObject+MagicalAggregation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSManagedObject+MagicalAggregation.m"; path = "Categories/NSManagedObject+MagicalAggregation.m"; sourceTree = "<group>"; };
C70ED69B1507BBA400486B6F /* NSManagedObject+MagicalRequests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSManagedObject+MagicalRequests.h"; path = "Categories/NSManagedObject+MagicalRequests.h"; sourceTree = "<group>"; };
C70ED69C1507BBA400486B6F /* NSManagedObject+MagicalRequests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSManagedObject+MagicalRequests.m"; path = "Categories/NSManagedObject+MagicalRequests.m"; sourceTree = "<group>"; };
C71A6A04150A18200035A24D /* NSManagedObjectContext+MagicalObserving.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSManagedObjectContext+MagicalObserving.h"; path = "Categories/NSManagedObjectContext+MagicalObserving.h"; sourceTree = "<group>"; };
C71A6A05150A18200035A24D /* NSManagedObjectContext+MagicalObserving.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSManagedObjectContext+MagicalObserving.m"; path = "Categories/NSManagedObjectContext+MagicalObserving.m"; sourceTree = "<group>"; };
C71A6A09150A18B70035A24D /* NSManagedObjectContext+MagicalSaves.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSManagedObjectContext+MagicalSaves.h"; path = "Categories/NSManagedObjectContext+MagicalSaves.h"; sourceTree = "<group>"; };
C71A6A0A150A18B70035A24D /* NSManagedObjectContext+MagicalSaves.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSManagedObjectContext+MagicalSaves.m"; path = "Categories/NSManagedObjectContext+MagicalSaves.m"; sourceTree = "<group>"; };
C71A6A0D150A194A0035A24D /* NSManagedObjectContext+MagicalThreading.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSManagedObjectContext+MagicalThreading.h"; path = "Categories/NSManagedObjectContext+MagicalThreading.h"; sourceTree = "<group>"; };
C71A6A0E150A194A0035A24D /* NSManagedObjectContext+MagicalThreading.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSManagedObjectContext+MagicalThreading.m"; path = "Categories/NSManagedObjectContext+MagicalThreading.m"; sourceTree = "<group>"; };
C721C7DC13D0C3A00097AB6F /* Mac App Unit Tests.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Mac App Unit Tests.app"; sourceTree = BUILT_PRODUCTS_DIR; };
C721C7DE13D0C3A00097AB6F /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
C721C7E213D0C3A00097AB6F /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; };
@@ -425,6 +437,49 @@
/* End PBXFrameworksBuildPhase section */

/* Begin PBXGroup section */
C71A6A11150A1A550035A24D /* NSManagedObject */ = {
isa = PBXGroup;
children = (
C7A98E1114F404B300CD2119 /* NSManagedObject+MagicalRecord.h */,
C7A98E1214F404B300CD2119 /* NSManagedObject+MagicalRecord.m */,
C70ED69B1507BBA400486B6F /* NSManagedObject+MagicalRequests.h */,
C70ED69C1507BBA400486B6F /* NSManagedObject+MagicalRequests.m */,
C70ED6931507B6AD00486B6F /* NSManagedObject+MagicalFinders.h */,
C70ED6941507B6AD00486B6F /* NSManagedObject+MagicalFinders.m */,
C70ED6971507B8C200486B6F /* NSManagedObject+MagicalAggregation.h */,
C70ED6981507B8C200486B6F /* NSManagedObject+MagicalAggregation.m */,
);
name = NSManagedObject;
sourceTree = "<group>";
};
C71A6A12150A1A630035A24D /* NSManagedObjectContext */ = {
isa = PBXGroup;
children = (
C7A98E1314F404B300CD2119 /* NSManagedObjectContext+MagicalRecord.h */,
C7A98E1414F404B300CD2119 /* NSManagedObjectContext+MagicalRecord.m */,
C71A6A04150A18200035A24D /* NSManagedObjectContext+MagicalObserving.h */,
C71A6A05150A18200035A24D /* NSManagedObjectContext+MagicalObserving.m */,
C71A6A09150A18B70035A24D /* NSManagedObjectContext+MagicalSaves.h */,
C71A6A0A150A18B70035A24D /* NSManagedObjectContext+MagicalSaves.m */,
C71A6A0D150A194A0035A24D /* NSManagedObjectContext+MagicalThreading.h */,
C71A6A0E150A194A0035A24D /* NSManagedObjectContext+MagicalThreading.m */,
);
name = NSManagedObjectContext;
sourceTree = "<group>";
};
C71A6A13150A1AB70035A24D /* Import Helpers */ = {
isa = PBXGroup;
children = (
C789905A1506A0340016F493 /* NSObject+MagicalDataImport.h */,
C789905B1506A0340016F493 /* NSObject+MagicalDataImport.m */,
C7A98E0D14F404B300CD2119 /* NSString+MagicalDataImport.h */,
C7A98E0E14F404B300CD2119 /* NSString+MagicalDataImport.m */,
C7A98E0714F404B300CD2119 /* NSNumber+MagicalDataImport.h */,
C7A98E0814F404B300CD2119 /* NSNumber+MagicalDataImport.m */,
);
name = "Import Helpers";
sourceTree = "<group>";
};
C721C7A013D0A3750097AB6F = {
isa = PBXGroup;
children = (
@@ -699,14 +754,6 @@
C7A98E0214F404B300CD2119 /* DataImport */ = {
isa = PBXGroup;
children = (
C70ED68B1507AE3900486B6F /* MagicalImportFunctions.h */,
C70ED68C1507AE3900486B6F /* MagicalImportFunctions.m */,
C789905A1506A0340016F493 /* NSObject+MagicalDataImport.h */,
C789905B1506A0340016F493 /* NSObject+MagicalDataImport.m */,
C7A98E0D14F404B300CD2119 /* NSString+MagicalDataImport.h */,
C7A98E0E14F404B300CD2119 /* NSString+MagicalDataImport.m */,
C7A98E0714F404B300CD2119 /* NSNumber+MagicalDataImport.h */,
C7A98E0814F404B300CD2119 /* NSNumber+MagicalDataImport.m */,
C7A98E0F14F404B300CD2119 /* NSManagedObject+MagicalDataImport.h */,
C7A98E1014F404B300CD2119 /* NSManagedObject+MagicalDataImport.m */,
C7A98E0314F404B300CD2119 /* NSAttributeDescription+MagicalDataImport.h */,
@@ -715,6 +762,9 @@
C7A98E0614F404B300CD2119 /* NSEntityDescription+MagicalDataImport.m */,
C7A98E0B14F404B300CD2119 /* NSRelationshipDescription+MagicalDataImport.h */,
C7A98E0C14F404B300CD2119 /* NSRelationshipDescription+MagicalDataImport.m */,
C70ED68B1507AE3900486B6F /* MagicalImportFunctions.h */,
C70ED68C1507AE3900486B6F /* MagicalImportFunctions.m */,
C71A6A13150A1AB70035A24D /* Import Helpers */,
);
name = DataImport;
path = Categories/DataImport;
@@ -766,16 +816,8 @@
C7A98E1C14F404B300CD2119 /* MagicalRecord.h */,
C7A98E1D14F404B300CD2119 /* MagicalRecord.m */,
C73ED8091507A05D0013734A /* MagicalRecord */,
C7A98E1114F404B300CD2119 /* NSManagedObject+MagicalRecord.h */,
C7A98E1214F404B300CD2119 /* NSManagedObject+MagicalRecord.m */,
C70ED69B1507BBA400486B6F /* NSManagedObject+MagicalRequests.h */,
C70ED69C1507BBA400486B6F /* NSManagedObject+MagicalRequests.m */,
C70ED6931507B6AD00486B6F /* NSManagedObject+MagicalFinders.h */,
C70ED6941507B6AD00486B6F /* NSManagedObject+MagicalFinders.m */,
C70ED6971507B8C200486B6F /* NSManagedObject+MagicalAggregation.h */,
C70ED6981507B8C200486B6F /* NSManagedObject+MagicalAggregation.m */,
C7A98E1314F404B300CD2119 /* NSManagedObjectContext+MagicalRecord.h */,
C7A98E1414F404B300CD2119 /* NSManagedObjectContext+MagicalRecord.m */,
C71A6A11150A1A550035A24D /* NSManagedObject */,
C71A6A12150A1A630035A24D /* NSManagedObjectContext */,
C7A98E1514F404B300CD2119 /* NSManagedObjectModel+MagicalRecord.h */,
C7A98E1614F404B300CD2119 /* NSManagedObjectModel+MagicalRecord.m */,
C7A98E1714F404B300CD2119 /* NSPersistentStore+MagicalRecord.h */,
@@ -1008,6 +1050,9 @@
C70ED6951507B6AE00486B6F /* NSManagedObject+MagicalFinders.m in Sources */,
C70ED6991507B8C300486B6F /* NSManagedObject+MagicalAggregation.m in Sources */,
C70ED69D1507BBA500486B6F /* NSManagedObject+MagicalRequests.m in Sources */,
C71A6A06150A18200035A24D /* NSManagedObjectContext+MagicalObserving.m in Sources */,
C71A6A0B150A18B70035A24D /* NSManagedObjectContext+MagicalSaves.m in Sources */,
C71A6A0F150A194A0035A24D /* NSManagedObjectContext+MagicalThreading.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -1079,6 +1124,9 @@
C70ED6961507B6AE00486B6F /* NSManagedObject+MagicalFinders.m in Sources */,
C70ED69A1507B8C300486B6F /* NSManagedObject+MagicalAggregation.m in Sources */,
C70ED69E1507BBA500486B6F /* NSManagedObject+MagicalRequests.m in Sources */,
C71A6A07150A18200035A24D /* NSManagedObjectContext+MagicalObserving.m in Sources */,
C71A6A0C150A18B70035A24D /* NSManagedObjectContext+MagicalSaves.m in Sources */,
C71A6A10150A194A0035A24D /* NSManagedObjectContext+MagicalThreading.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};

This file was deleted.