我在 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/