我正在研究一个非常复杂的iPad应用程序,它可能运行大约10个独立的线程。每个线程使用核心数据执行一些数据IO操作。我试图想出一个简单而优雅的解决方案来简化合并过程。并发与NSManagedObjectContext
背景故事
我的应用程序使用什么我指的是作为一个引擎。我的应用可能有很多引擎。每个引擎以连续的间隔运行,每个引擎都有一个特定的目标:清理,获取和合并RSS,获取和合并主题更改,获取和合并文档。每个引擎都在自己的线程中运行,每个线程都有自己的托管对象上下文。
问题
而不是观察每个引擎的NSManagedObjectContextDidSaveNotification
,我想出了这个想法从NSManagedObjectContext
类派生,并有IT观察/合并更改。
有没有人知道围绕此方法的任何疑难解答或问题?
这里是它看起来可能像粗糙例如:
.H
@interface SelfMergingManagedObjectContext : NSManagedObjctContext
@end
.M
@interface SelfMergingManagedObjectContext()
-(void)observeDidSaveNotification;
@end
@implementation SelfMergingManagedObjectContext
-(id)initWithConcurrencyType:(NSManagedObjectContextConcurrencyType)ct
{
..
..
..
[self observeDidSaveNotification];
return self;
}
-(id)init
{
..
..
..
[self observeDidSaveNotification];
return self;
}
-(id)initWithCoder:(NSCoder *)aDecoder
{
..
..
..
[self observeDidSaveNotification];
return self;
}
-(void)observeDidSaveNotification
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contextDidSave:) name:NSManagedObjectContextDidSaveNotification object:nil];
}
-(void)contextDidSave:(NSNotification *)notif
{
[self mergeChangesFromContextDidSaveNotification:notif];
}
-(void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];
}
@end
感谢您的支持!我将合并策略设置为NSMergeByPropertyObjectTrumpMergePolicy。尽管上下文的创建可能发生在后台线程上,这意味着合并策略可能不会在主线程上设置。好建议..我会研究一下! – Jeremy 2012-02-15 18:08:32
确保它设置在主线程上,因为这是合并的唯一地方!在后台线程上设置合并策略无效,因为它总是合并到主线程上下文中。 – 2012-02-15 18:19:01
我不知道。再次感谢! – Jeremy 2012-02-15 18:19:58