目前我正在通过在ViewDidLoad中执行以下操作来设置我的NSManagedContext:
·H
@property (nonatomic,strong) NSManagedObjectContext* managedObjectContext;
的.m
viewDidLoad {
_managedObjectContext = [NSManagedObjectContext MR_contextForCurrentThread];
}
问题:我是否必须将此相同的托管上下文传递给我希望有权访问此ManagedContexts的所有后续viewcontroller,或者我是否可以为每个写入一个新的@property
新的viewcontroller的.h然后在.m中设置每个新的viewcontrollers ManagedObject _managedObjectContext = [NSManagedObjectContext MR_contextForCurrentThread];
答案 0 :(得分:4)
设置Core Data堆栈后,MagicalRecord会创建“主队列并发类型”的默认上下文。如果所有视图控制器都使用此默认上下文,则可以
[NSManagedObjectContext MR_defaultContext]
来获取
默认上下文,你也可以,正如你现在所做的那样
[NSManagedObjectContext MR_contextForCurrentThread]
中调用viewDidLoad
以获取默认上下文。但是最后一种方法的作用只是因为总是在主线程上调用viewDidLoad
在这种情况下,MR_contextForCurrentThread
返回默认上下文。
但是,如果从非主要调用,MR_contextForCurrentThread
会创建其他上下文(私有队列并发类型)
线程,并将上下文与固定的NSThread
相关联。但是,正如@casademora正确地说的那样,这样的私有队列上下文并不总是为每个使用相同的线程
操作。所以MR_contextForCurrentThread
不应该用在非主线程上,
如果从主线程调用它,它与MR_defaultContext
相同。
因此,即使它适用于您的情况,您也应该避免使用方法(3)。不管你选择 方法(1)或(2)纯粹是味道问题。
如果您需要其他背景信息,例如对于后台导入操作,您可以调用
例如MR_context
或MR_contextWithStoreCoordinator
并将该上下文传递给其他人
这是必需的。
答案 1 :(得分:0)
请停止使用contextForCurrentThread。这对于使用GCD队列来说是双倍的。虽然GCD队列是在线程模型之上实现的,但无法保证为每个后续块获取相同的实际线程。
如果需要新上下文,请创建新的专用队列,主队列或限制上下文。