ios - 是否有某种方法可以让每个应用程序都使用单个 NSManagedObjectContext 进行读取和写入?

标签 ios multithreading core-data magicalrecord

我在 iOS 应用中使用了 CoreData + MagicalRecord。应用程序有许多与同时读取和写入相关的多线程问题,来自不同的线程。还存在快速读取大量数据的要求。据此,仅使用一个 NSManagedObjectContext 。为了实现这个目标,使用@synchronization 创建了某种类型的管理器。主要问题在于 Manager 检索的 NSManagedObjects 上的读写冲突。因此,如果我在一个线程中访问 NSManaged 对象的一个​​属性,而在另一个线程中我在管理器中读取相同的信息 - 应用程序将崩溃。如何用单个 NSManagedObjectContext 解决这个问题?任何帮助将不胜感激。谢谢。

附言我知道每个线程一个多个上下文将解决这个问题。但我需要经常在线程之间传输更改和对象,而且速度不会像我需要的那么快。

最佳答案

在不同线程之间使用相同的 NSManagedObjectContext 非常危险。我可能会导致很多意想不到的状态和崩溃。

如果您想在线程之间传输更改和对象,以下步骤可能会帮助您

考虑您想要从上下文 A 转移到 B

1) 向上下文 A 注册以下 NSManagedObjectContextDidSaveNotification。

例如。 [[NSNotificationCenter defaultCenter] addObserver:delegete selector:@selector(mergeContext:) name:NSManagedObjectContextDidSaveNotification object:contextA];

2)在您的委托(delegate)类中实现合并上下文

-(void)mergeContext:(NSNotification *) nofify {

if ([NSThread isMainThread]) {

    [contextB mergeChangesFromContextDidSaveNotification:nofify];
    NSError *error = nil;
    [contextB save:&error];
}
else
{
    [self performSelectorOnMainThread:@selector(mergeContext:) withObject:nofify waitUntilDone:YES];
}

}

3) 你必须在哪里将数据从上下文 A 传输到 B 执行相同的操作。这将触发合并操作

    NSError *error = nil;
    [contextA save:&error];

4)在线程结束时不要忘记取消注册通知

[[NSNotificationCenter defaultCenter] removeObserver:delegate name:NSManagedObjectContextDidSaveNotification object:contextA];

希望这能解决您的问题。

谢谢

关于ios - 是否有某种方法可以让每个应用程序都使用单个 NSManagedObjectContext 进行读取和写入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23742076/

相关文章:

multithreading - 线程池、线程安全队列、OOP

objective-c - 使用 NSFetchedResultsController 将谓词从核心数据模型提取到各个部分中

cocoa - 更改 NSPersistentDocument 的默认 NSManagedObjectContext

ios - 具有多个持久存储的核心数据

ios - Xcode:如何从特定配置的构建阶段删除目标依赖项

javascript - Javascript 添加的样式在 IOS 中不起作用

java - 由于多线程应用程序中的 AtomicXXX 变量,volatile 关键字是否失去了相关性?

c++ - Quest 库(Quest 身份验证服务)线程安全吗?

ios - 快速限制 init() 中的输入选项

ios - 当从 xcode 推送通知安装构建时工作但是当安装 ipa 时它不工作