2012-02-15 45 views
-1

我正在研究一个非常复杂的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 

回答

3

通常这种事情是作为NSManagedObjectContext上的类别完成的。使用扩展方法,我没有发现任何问题,只要您始终使用托管对象上下文来获取正确的类型即可。

正视使用多个托管对象上下文 - 确保为主线程上的托管对象上下文设置合并策略,默认会在合并时引发异常。也尽量保持可能的合并非常小。

+0

感谢您的支持!我将合并策略设置为NSMergeByPropertyObjectTrumpMergePolicy。尽管上下文的创建可能发生在后台线程上,这意味着合并策略可能不会在主线程上设置。好建议..我会研究一下! – Jeremy 2012-02-15 18:08:32

+0

确保它设置在主线程上,因为这是合并的唯一地方!在后台线程上设置合并策略无效,因为它总是合并到主线程上下文中。 – 2012-02-15 18:19:01

+0

我不知道。再次感谢! – Jeremy 2012-02-15 18:19:58