2012-02-15 11 views
-1

私は非常に複雑なiPadアプリケーションを開発しています。各スレッドは、コアデータを使用していくらかのデータ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

+0

マージする場所が唯一の場所なので、メインスレッドに設定されていることを確認してください!バックグラウンドスレッドにマージポリシーを設定しても、メインスレッドコンテキストに常にマージされるため、効果はありません。 –

+0

私はそれを知らなかった。再度、感謝します! – Jeremy