2012-02-15 24 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