私は非常に複雑な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
:ここで
は、それがどのように見えるかのラフ例です
ヘッドアップありがとう!私はマージポリシーをNSMergeByPropertyObjectTrumpMergePolicyに設定しました。ただし、コンテキストの作成はバックグラウンドスレッドで発生する可能性があります。つまり、マージポリシーがメインスレッドで設定されていない可能性があります。良い助言..私はそれを見てみましょう! – Jeremy
マージする場所が唯一の場所なので、メインスレッドに設定されていることを確認してください!バックグラウンドスレッドにマージポリシーを設定しても、メインスレッドコンテキストに常にマージされるため、効果はありません。 –
私はそれを知らなかった。再度、感謝します! – Jeremy