gpt4 book ai didi

ios - 何时以及为何使用多个 NSManagedObjectContext?

转载 作者:技术小花猫 更新时间:2023-10-29 11:15:08 24 4
gpt4 key购买 nike

基本上,我只在我的应用程序中使用了一个 moc,但我认为在某些情况下我应该使用多个 NSManagedObjectContext。

  1. 什么时候应该使用多个 NSManagedObjectContext?
  2. 我听说在某些情况下我应该使用 3 moc,但我不知道在哪些情况下我应该使用 3 moc?

最佳答案

通常,您希望为每个将访问 Core Data 数据库的线程使用单独的 NSManagedObjectContext。这是为了防止对象图由于并发写入同一上下文而可能进入不一致状态。

处理这个问题的最简单方法是为每个线程创建一个新的 NSManagedObjectContext 并共享一个 NSPersistentStoreCoordinator

在您的 AppDelegate 中创建一个类型为 NSManagedObjectContext 的属性,并覆盖 getter 以便为每个调用线程返回一个新的上下文。通过利用每个线程的 threadDictionary 来做到这一点。

首先,像往常一样设置您的 managedObjectModel 和 persistentStoreCoordinator。然后在您的 AppDelegate 中创建您的上下文并分配给您的属性:

self.managedObjectContext = [[NSManagedObjectContext alloc] init];
self.managedObjectContext.persistentStoreCoordinator = self.storeCoordinator;

在您的 managedObjectContext getter 覆盖中,使用以下代码为每个调用线程返回一个单独的上下文:

- (NSManagedObjectContext *) managedObjectContext
{
NSThread *thisThread = [NSThread currentThread];
if (thisThread == [NSThread mainThread])
{
//For the Main thread just return default context iVar
return _managedObjectContext;
}
else
{
//Return separate MOC for each new thread
NSManagedObjectContext *threadManagedObjectContext = [[thisThread threadDictionary] objectForKey:@"MOC_KEY"];
if (threadManagedObjectContext == nil)
{
threadManagedObjectContext = [[[NSManagedObjectContext alloc] init];
[threadManagedObjectContext setPersistentStoreCoordinator: [self storeCoordinator]];
[[thisThread threadDictionary] setObject:threadManagedObjectContext forKey:@"MOC_KEY"];

}

return threadManagedObjectContext;
}
}

现在,在您访问 AppDelegate 的 managedObjectContext 属性的代码中的任何地方,您都将确保线程安全。

关于ios - 何时以及为何使用多个 NSManagedObjectContext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17593456/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com