gpt4 book ai didi

ios - UIManagedDocument,后台线程和父上下文

转载 作者:行者123 更新时间:2023-12-01 17:56:33 26 4
gpt4 key购买 nike

在UIManagedDocument的文档中简要提到了以下内容:

为了支持异步数据写入,Core Data实际上使用一对嵌套的托管对象上下文。

是特定于UIManagedDocument还是Core Data总是这样做?

同一文件还指出

如果合适,您可以将数据从后台线程直接加载到父上下文。

这是否意味着在以下代码中

NSManagedObjectContext *moc = self.managedObjectContext;
[moc performBlock:^() {
Record *record = [NSEntityDescription
insertNewObjectForEntityForName:@"Record"
inManagedObjectContext:moc];
}];

我只需将第一行替换为
NSManagedObjectContext *moc = self.managedObjectContext.parentContext;

完成那个?

我想我也对直接使用此父上下文在哪里“合适”感到困惑。我的意思是,听起来已经像PerformBlock用于将任务卸载到后台队列。为什么我需要弄乱父上下文?

如果有人为我澄清所有这些,我将不胜感激。

最佳答案

这是UIManagedDocument的实现细节,但这是Core Data应用程序中的常见设计模式。 managedObjectContextUIManagedDocument是并发类型为NSMainQueueConcurrencyType的上下文,而parentContext是并发类型为NSPrivateQueueConcurrencyType的上下文。

有关并发类型的更多信息,请参见here。简而言之,父上下文使用后台队列进行操作,而子上下文使用主队列。

通常,当您希望在后台队列中以非阻塞方式执行某些操作时,您希望直接与父上下文一起工作。例如,如果您希望执行冗长而困难的提取请求,则可以直接在父上下文上执行它。请记住,返回的对象在上下文之间是不可互换的,因此您必须将返回的对象从一个上下文重新提取到另一个上下文中(但是现在可以使用[NSPredicate predicateWithFormat:@"SELF IN %@", fetchedObjectsFromAnotherContext]轻松地执行重新提取)。

综上所述,这取决于您在手术中要做的事情。主队列上下文不需要您使用performBlock:,从而大大简化了事情,因为所有事情都在主队列(主线程)上执行。如果仅希望插入对象,则由于操作系统进行上下文切换,转移到专用队列的好处将是微不足道的,甚至是有害的。但是,如果要执行此对象插入,而您需要执行繁重的工作,则可以将其卸载到后台队列中,然后直接在父上下文中执行。

关于ios - UIManagedDocument,后台线程和父上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16369159/

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