gpt4 book ai didi

ios - 核心数据并发 : avoid writing at two seperate places

转载 作者:行者123 更新时间:2023-11-29 02:30:48 25 4
gpt4 key购买 nike

我正在做一些繁重的核心数据插入工作(比如 A) 刚登录到私有(private)上下文(以避免主线程阻塞)。在这完成之前,不幸的是在代码的某个地方还有一个插入工作(说B)(不重)但是是必不可少的并且还使用私有(private)上下文来保存。

问题:在将记录保存到任何地方时,我检查它们是否已经在数据库中(以确保唯一记录),但是在完成上述任务并检查核心数据后,我发现一些记录重复,这仅仅是因为在我在任务 A 中调用“保存”之前,另一个进程 B 已经写入了重复记录。

我正在寻求和解,预见到两个选择:

  1. 让第二个任务等待第一个任务(在另一个线程中分派(dispatch)并等待直到完成)
  2. 请推荐!!

编辑:事实证明,问题更多地与合并而不是并发有关,合并会创建重复记录,并发就好了,抛出的错误是:

NSCocoaErrorDomain Code=133020

更新:合并问题已通过覆盖合并策略修复

最佳答案

您自己在问题中说过,您的对象正在重复,因为您是从两个不同的位置保存的。

一种策略是使用相同的 NSManagedObjectContext 执行所有写入。很少需要创建多个后台上下文来执行写入(除非您的写入可能需要很长时间)。

话虽如此,您恰好处于两个 Write 操作可能写入同一对象的位置。我将通过单个接口(interface)管理所有写入,然后该接口(interface)将保留用于写入的私有(private)上下文。由于上下文是一个串行队列,您可以保证您不会将同一个对象写入两次(假设您的重复检查非常可靠)。

所以你的界面可能如下所示:

@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

尽管如此,您可以通过多种方式定义一个接口(interface),但重要的是您有一个单一的接口(interface)来处理您的 Core Data 读取和写入。

关于ios - 核心数据并发 : avoid writing at two seperate places,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26904215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com