gpt4 book ai didi

ios - 处理核心数据中的大量删除/插入

转载 作者:行者123 更新时间:2023-11-29 12:05:20 25 4
gpt4 key购买 nike

我正在处理这样一种情况,其中存在一些对象,如果要删除这些对象,将通过级联删除关系导致指数级的删除量。这样,删除其中的 20 个对象可能会导致约 3,000 个对象最终被删除。如果在主上下文中执行,这可能会导致非常慢的保存。

为了解决这个问题,我创建了一个“worker”上下文,它使用与主上下文相同的持久存储,在那里进行更改,然后保存 worker 上下文并将这些更改与主上下文合并:

NSManagedObjectContext *workerContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];

workerContext.persistentStoreCoordinator = mainContext.persistentStoreCoordinator;

[notificationCenter addObserver:self selector:@selector(workerContextDidSave:) name:NSManagedObjectContextDidSaveNotification object:workerContext];

// Here I do a 'superficial' deletion on the main context, so the UI updates,
// but do the actual deletion on the worker context. Then I save the worker context:

[workerContext save:nil];

// Which fires spawnedWorkerContextDidSave:, where I merge changes to the main context:

[mainContext performBlockAndWait:^{
[mainContext mergeChangesFromContextDidSaveNotification:notification];
}];

我的问题是:处理这类大批量删除的最常见方法是什么?我上面的方法有什么陷阱吗?此外,合并会在主线程上造成一些小的滞后,但与我在主线程上进行删除和保存时的状态相差无几。

最佳答案

通过第二个上下文删除数据的方法很好。

您可能会发现,如果您先预取数据,它的工作速度会更快:只需对您将在后台上下文中删除的对象执行一个获取请求,并将关系设置为预取。这将在您删除之前将数据拉入行缓存(内存),这样可以节省对磁盘的访问。

如果您发现在主线程上合并更改的延迟是一个问题,您可以考虑只重置主上下文。缺点是您的应用程序必须重新获取其所有数据。例如,您可以发出通知以警告应用程序的不同部分重置 a) 将要发生,以及 b) 已经发生。

最后,现在 Core Data 中有 API 可以在后台执行大量删除,而无需将数据拉入内存。主要的缺点是你必须小心自己合并删除的对象,因为上下文不会知道它们已被删除。

关于ios - 处理核心数据中的大量删除/插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35236941/

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