gpt4 book ai didi

iphone - 核心数据和多线程编程

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:23:01 25 4
gpt4 key购买 nike

我知道这不是一个新话题,但我还没有找到关于我的问题的明确答案。

我正在做一个项目,它有一个包含“书”的核心数据模型。因此,当我通过网络下载 json 数据时,我想将这些 Book 模型存储在我的核心数据中(当然在后台线程中以不阻塞 UI),然后将这些 Book 模型传递给我的 Controller 和加载表。

但是,当我学习了Apple的Core Data Reference时,我感到困惑。该文件说我不应该在上下文之间传递托管对象。但是我有两个上下文,一个用于主线程,一个用于后台线程,用于下载、存储数据和获取当前更新的数据。所以我应该做的是在后台获取托管对象 ID,并将这些 ID 传递给主线程中的上下文,然后在主线程中获取具有这些 ID 的托管对象。

问题来了。在主线程中获取具有 id 的托管对象会阻塞 UI 吗?当我在主线程中获取带有其 id 的托管对象时,我是在访问 SQLite 吗?如果这些获取的托管对象中有一些是错误的,这意味着如果我想获取它们的属性我可能会执行 IO,我认为它仍然会阻塞我的 UI。

那么,在不阻塞 UI 的情况下,使用 Core Data 在后台获取数据并在主线程中显示这些数据(UI 操作应该在主线程中)的实用模式是什么?

感谢您的帮助!


反射(reflection):

其实所有的答案都没有解决我的问题。但是,我又回到了一个考虑,当我们需要在核心数据中使用多线程编程时。对于大多数情况,也许直接使用核心数据就足够有效了。我高估了主线程中核心数据操作的成本。

不过,我仍然希望有人推荐一个实用的模式来在后台进行抓取,并在主线程中显示。我将不胜感激!

最佳答案

在您的情况下,我会使用三个 MOC。

NSManagedObjectContext *worker = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyTyep];
worker.persistentStoreCoordinator = // your PSC
NSManagedObjectContext *main = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
main.parentContext = worker;

然后,每当您想执行后台操作时,创建一个后台 MOC 作为主 MOC 的子级。

NSManagedObjectContext *background = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
background.parentContext = main;

请记住,保存上下文只会保存一个级别。因此,当您保存后台上下文时,更改将自动推送到主上下文中。

然后您可以随时保存主上下文...但在某些时候您需要保存工作上下文。 UIManagedDocument 自动为您处理 main/worker 保存交互(但您在使用它时会放弃一些控制权)。

您在这里获得的另一个好处是实际的 IO 操作不会在主线程中发生。

关于iphone - 核心数据和多线程编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16163918/

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