forked from magicalpanda/MagicalRecord
/
NSManagedObjectContext+MagicalThreading.m
73 lines (59 loc) · 2.29 KB
/
NSManagedObjectContext+MagicalThreading.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
//
// 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;
{
typedef NSManagedObjectContext *(^RecursiveCallback)(NSManagedObjectContext *);
__block RecursiveCallback findLastContext = 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