gpt4 book ai didi

ios - UIManagedDocument:如何在后台执行保存

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

我有一个连接到 NSFetchedResultsController 的 TableView ,相应的 managedObjectContext 是 self.myDatabase.managedObjectContext:

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

现在,每当用户刷新页面时,我都会执行以下代码。本质上,我创建了一个新线程来加载数据,然后在 MOC 安全线程上更新/保存新数据:

dispatch_queue_t fetchQ = dispatch_queue_create("fetcher", NULL);
dispatch_async(fetchQ, ^{
NSArray *data = [MyAPI myData];

[document.managedObjectContext performBlock:^{
for (NSDictionary *info in data) {
[MyEntity createOrUpdateGivenInfo:info andManagedObjectContext:self.myDatabase.managedObjectContext];
}
}];
});
dispatch_release(fetchQ);

这工作正常:我得到了我的更新并且表格 View 正确显示了所有内容。唯一的问题是 UI 没有响应,大概是因为我在主线程上进行了保存/更新。因此,我研究了通过此修改在后台线程上执行它:

NSManagedObjectContext *backgroundContext = [[NSManagedObjectContext alloc] init WithConcurrencyType:NSPrivateQueueConcurrencyType];
[backgroundContext setParentContext:self.myDatabase.managedObjectContext];

[backgroundContext performBlock:^{
NSArray *data = [MyAPI myData];

for (NSDictionary *info in data) {
[MyEntity createOrUpdateGivenInfo:info andManagedObjectContext:backgroundContext];
}

[backgroundContext save:nil];

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

但是,虽然现在 UI 是响应式的,但我在使用表格 View 时遇到了很多麻烦:表格没有更新现有的条目,而是显示了一个额外的条目(一个不应该存在的副本)。我认为这可能是因为这两个上下文没有同步/合并,但是通过阅读之前的 SO 帖子,我相信我只需要在 backgroundContext 上调用 save,然后在主 MOC 上调用 updateChangeCount。如果我重新启动应用程序,一切都会再次正常运行 - 直到我再次刷新。

有没有人可以帮忙。我真的开始拔头发了。

如果你能解开这个谜,我就给你啤酒。

最佳答案

UIManagedDocument 为您创建两个上下文:NSPrivateQueueConcurrencyType 的根上下文和 NSMainQueueConcurrencyType 的子上下文。

像您所做的那样将您的 NSFetchedResultsController 连接到 document.managedObjectContext,因为这是您的主线程的上下文。

读/写在后台线程上自动发生。 UIManagedDocument 负责这件事。你不必担心。

如果您需要自己做一些繁重的工作,您可以创建另一个 NSMainQueueConcurrencyType 的托管对象,并将您的 document.managedObjectContext 作为其父对象。

我阅读了您的代码,看起来这就是您所做的并且应该可行。这正是我在我的应用程序中所做的。但我已经看到其他几个人报告了带有 NSFetchedResultsController 的重复条目,怀疑存在框架错误。

如果你愿意分享你的项目,我会看一看。

关于ios - UIManagedDocument:如何在后台执行保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11353608/

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