質問で自分で言ったのですが、2 つの異なる場所から保存しているため、オブジェクトが複製されています。
1 つの戦略は、同じ NSManagedObjectContext を使用してすべての書き込みを実行することです。書き込みを実行するために複数のバックグラウンド コンテキストを作成する必要はほとんどありません (書き込みに時間がかかる場合を除きます)。
はっきり言って、2 つの書き込み操作で同じオブジェクトを書き込む可能性があります。すべての書き込みを単一のインターフェイスで管理すると、このインターフェイスは書き込み用のプライベート コンテキストを保持します。コンテキストはシリアル キューであるため、同じオブジェクトを 2 回書き込むことができないことを保証できます (重複のチェックがしっかりしていると仮定します)。
したがって、インターフェースは次のようになります。
@interface CoreDataManager : NSObject
+ (CoreDataManager*)sharedManager;
- (void)performWriteWithBlock:(void (^)(NSManagedObjectContext *writeContext))writeBlock;
@end
@implementation CoreDataManager
+ (CoreDataManager *)sharedManager {
static dispatch_once_t once;
dispatch_once(&once, ^ {
self.writeContext = [[self class] createBackgroundPersistanceObjectContext];
});
return sharedManager;
}
- (void)performWriteWithBlock:(void (^)(NSManagedObjectContext *writeContext))writeBlock {
if (writeBlock) {
writeBlock(self.writeContext);
[self.writeContext save:nil];
}
}
+ (NSManagedObjectContext *)createBackgroundPersistanceObjectContext {
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
[context setPersistentStoreCoordinator:coordinator];
context.mergePolicy = NSMergeByPropertyStoreTrumpMergePolicy;
context.undoManager = nil;
return context;
}
@end
それにもかかわらず、インターフェイスを定義する方法はたくさんありますが、重要なのは、コア データの読み取りと書き込みを処理する単一のインターフェイスを用意することです。