gpt4 book ai didi

objective-c - 带有 NSFetchedResultsController 和背景上下文的 UIManagedDocument

转载 作者:行者123 更新时间:2023-11-28 22:53:21 26 4
gpt4 key购买 nike

我正在尝试使以下工作。

我有一个表格 View ,它在表格 View 中显示从 API 获取的数据。为此,我正在使用 NSFetchedResultsController:

self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
managedObjectContext:self.database.managedObjectContext
sectionNameKeyPath:nil
cacheName:nil];

我在这样的背景上下文中创建我的实体:
    NSManagedObjectContext *backgroundContext;
backgroundContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
backgroundContext.parentContext = document.managedObjectContext;

[backgroundContext performBlock:^{
[MyAPI createEntitiesInContext:backgroundContext];

NSError *error = nil;
[backgroundContext save:&error];
if (error) NSLog(@"error: %@",error.localizedDescription);

[document.managedObjectContext performBlock:^{
[document updateChangeCount:UIDocumentChangeDone];
[document.managedObjectContext save:nil];
}];

现在,每当我获得新数据(以及如上所示的插入/更新实体)时,我的 NSFetchedResultsController 就无法正常工作。特别是,我总是更新一个实体(而不是创建一个新实体),但我的表格 View 显示了两个实体。一旦我重新启动应用程序,它就会正确显示。

如果我在 self.database.managedObjectContext 中创建实体([MyAPI createEntities]),一切正常。

知道我做错了什么吗?浏览 SO 上的现有线程让我认为我的做法是正确的。同样,如果我不在后台上下文中保存核心数据(但在 document.managedObjectContext 上),那么它可以正常工作......

最佳答案

我今天在 Apple 开发论坛上读到了类似的问题。也许这和你的问题一样,https://devforums.apple.com/message/666492#666492 ,在这种情况下,可能存在错误(或至少有其他有相同问题的人可以讨论!)。

假设不是,听起来您想要做的事情应该完全可以使用嵌套上下文,因此假设 UIManagedDocument 没有错误.

我唯一的保留是我一直在尝试使用 UIManagedDocument 进行批量加载。并且它似乎不适用于嵌套上下文( https://stackoverflow.com/q/11274412/1347502 )。我认为 NSFetchedResultsController 的主要好处之一是它是否能够通过批量加载来提高性能。所以如果这不能在 UIManagedDocument 中完成也许 NSFetchedResultsController尚未准备好与 UIManagedDocument 一起使用但我还没有深入了解这个问题。

撇开这个保留不谈,我阅读或查看的关于嵌套上下文和后台工作的大部分说明似乎都是使用 完成的。同行子上下文。您所描述的是父、子、孙配置。在 WWDC 2012 视频“Session 214 - Core Data Best Practices”(+ 16:00 分钟)中,Apple 建议在此场景的父上下文中添加另一个对等上下文,例如

backgroundContext.parentContext = document.managedObjectContext.parentContext;

该工作在此上下文中异步执行,然后通过调用将其推送到父级以保存在后台上下文中。然后将异步保存父级和任何对等上下文,在本例中为 document.managedObjectContext ,将通过获取、合并或刷新访问更改。这也在 UIManagedDocument 中有所描述。文档:
  • 如果合适,您可以直接从后台线程加载数据
    到父上下文。您可以使用获取父上下文
    父上下文。将数据加载到父上下文意味着您不需要
    扰乱子上下文的操作。您可以检索加载的数据
    在后台只需执行一次提取。

  • [编辑:重新阅读它可能只是推荐 Jeffery 的建议,即根本不创建任何新上下文,而只是使用父上下文。]

    话虽如此,文档还建议您通常不要在子上下文中调用 save 而是使用 UIManagedDocument的保存方法。这可能是您调用 save 的时候,也可能是问题的一部分。正如 Jeffery 所提到的,更强烈地不鼓励在父上下文上调用 save。我读过的关于堆栈溢出的另一个答案建议仅使用 updateChangeCount触发 UIManagedDocument保存。但是我没有从 Apple 读到任何东西,所以在这种情况下,也许可以调用 UIManagedDocument saveToURL:forSaveOperation:completionHandler:方法适合使所有内容同步并保存。

    我想下一个明显的问题是如何通知 NSFetchedResultsController 发生了变化。我很想简化上面讨论的设置,然后订阅各种 NSManagedObjectContextObjectsDidChangeNotification或在不同的上下文中保存通知并查看在 UIMangedDocument 时调用哪些通知(如果有)保存、自动保存或将背景更改保存到父级时(假设在这种情况下是允许的)。我假设 NSFetchedResultsController连接到这些通知,以便与基础数据保持同步。

    或者,您可能需要在主上下文中手动执行提取、合并或刷新以获取更改,然后以某种方式通知 NSFetchedResultsController。它需要刷新吗?

    我个人想知道 UIManagedDocument已准备好用于一般消费,今年的 WWDC 上没有提及它,而是提出了关于如何构建更复杂的解决方案的冗长讨论:“Session 227 - Using iCloud with Core Data”

    关于objective-c - 带有 NSFetchedResultsController 和背景上下文的 UIManagedDocument,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11350670/

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