您在问题中自己说过,您的对象被复制,因为您从两个不同的位置保存。
一种策略是使用相同的 NSManagedObjectContext 执行所有写入。很少需要创建多个后台上下文来执行写入(除非您的写入需要很长时间)。
话虽如此,您恰好处于您的两个写入操作可能写入同一个对象的位置。我将通过单个接口管理所有写入,然后该接口将保留用于写入的私有上下文。由于上下文是一个串行队列,您可以保证您不能两次写入同一个对象(假设您的重复检查是坚如磐石的)。
所以你的界面可能是这样的:
@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
尽管如此,您可以通过多种方式定义接口,但重要的是您有一个处理核心数据读取和写入的接口。