我正在研究一個非常複雜的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