向核心数据添加大量数据,同时保持 UI 响应式
Posted
技术标签:
【中文标题】向核心数据添加大量数据,同时保持 UI 响应式【英文标题】:Adding a lot of data to core data while keeping the UI responsive 【发布时间】:2011-04-03 12:07:32 【问题描述】:我正在寻找一种方法来将全部数据负载添加到核心数据中,同时保持小活动指示器在 UI 上旋转。我尝试在另一个线程上添加数据,但因为了解到核心数据不是线程安全的,我得到了各种错误。任何人都可以提出另一种方法吗?
提前致谢。
【问题讨论】:
在后台线程加载数据时,您会尝试做些什么来收到错误消息?您是否单击任何会读取或写入 CoreData 的内容? 【参考方案1】:Core Data 不是线程安全的,但这只是意味着您必须正确编码,而不是完全避免它们。为了使您的 UI 保持响应/最新,您需要使用线程。
Apple 关于该主题的文档是 here,this blog post 是一个出色的演练,介绍了在 Core Data 中使用多线程以及所涉及的一些陷阱。
【讨论】:
【参考方案2】:您需要为每个线程使用单独的托管对象上下文。您需要做一些额外的工作才能使其他上下文的更改可用于主线程的上下文:请参阅Concurrency with Core Data 以获得完整的讨论。
【讨论】:
【参考方案3】:最有用的示例是从 ios 示例代码下载的核心数据 XML。如果你没有访问权限,请告诉我,我会在这里写下它的主要结构。 从 u UIviewController 到 nsoperation 委托有一个复杂的自定义委托技术,这对于您立即开始向用户显示内容并显示同步进度非常重要。 在 AppStore 中,您可以看到我的“snow IXC”应用程序,您可以在其中看到为在其 UIviewController 中指示用户进度而实施的这种技术。可免费下载。
【讨论】:
【参考方案4】:这就是我如何避免使用加载指示器的后台线程(我使用 DSActivityView,但这应该适用于其他实现):
在您的代码中,当您要显示指标时,首先运行所有代码以显示指标。在该代码之后有一个单独的方法调用来完成所有加载工作。使用方法调用它:
[self performSelector:@selector(loadMethodName) withObject:nil afterDelay:0.0];
通常应用程序会直接进入加载代码,而无需等待显示指示器视图。通过这种方式调用它,它将首先完成指示器的显示,然后再进入加载代码。
【讨论】:
以上是关于向核心数据添加大量数据,同时保持 UI 响应式的主要内容,如果未能解决你的问题,请参考以下文章
RestKit,核心数据,神奇的记录,大量数据和滞后的 UI
当 CPU 负载为 100%(主要使用 C++ 和 Qt)时,如何保持 UI 响应?