9

将大量 XML 从 RESTful 服务异步提取到 Core Data 存储中,并从该存储中动态填充 a 的良好实践是什么UITableView

我正在考虑使用 libxml2 的xmlParseChunk()函数来解析传入的 XML 块,并在节点进入时将节点及其子节点转换为相关的托管对象。

在将这些 XML 节点变成托管对象的同时,我想UITableView依次生成行。比如说,一次 50 行。这是现实的吗?

根据您的经验,您如何完成此任务、保持性能并可能处理数千行?是否有不同的、更简单的方法同样有效或更好?

4

3 回答 3

14

当然,这是一件很标准的事情。最简单的解决方案是在一个 MOC 上的后台线程中进行加载,并让 UI 在具有自己的 MOC 的主线程上运行。每当您获得想要出现的一大块数据(例如 50 个条目)时,您就有了背景 MOC save:

假设您已将前台 MOC 操纵为合并更改(通过mergeChangesFromContextDidSaveNotification:),那么每当您保存后台 MOC 时,前台 MOC 将获得所有这些更改。假设您使用的是 NSFetchedResultsController,它具有处理其 MOC 更改的委托方法,如果您使用的是 Apple 的示例代码,那么您可能已经正确设置了所有内容。

一般来说,CoreData 会比你自己滚动的任何东西都快,除非你真的知道自己在做什么,并且愿意花大量时间来调整你的具体情况。您可以做的最重要的事情是确保缓慢的事情(如 XML 处理和由 引起的同步闪存 I/O save:)不在主线程上阻塞用户交互。

于 2009-10-06T07:24:02.523 回答
2

Joe Hewitt(Facebook 应用程序开发人员)已将他的大部分代码作为开源发布。它被称为Three20。那里有一个类非常适合获取 Internet 数据并将其填充到表中,而无需事先获取数据。用于此的类称为TTTableViewControllerTTTableViewDataSource

从这里开始,将其存储为 CoreData 并没有太大的难度,只需将您认为适合提供的钩子的类子类化即可。

如果您担心数据过多,一次 50 个听起来很合理。这些类有一个内置的“更多”按钮来帮助你。

从 Three20 自述文件:

Internet 感知表视图控制器
TTTableViewController 和 TTTableViewDataSource 帮助您构建从 Internet 加载其内容的表。TTTableViewController 不仅仅假设您已准备好所有数据,就像 UITableView 默认情况下所做的那样,TTTableViewController 允许您在数据加载时以及出现错误或无显示时进行通信。它还可以帮助您添加“更多”按钮来加载下一页数据,并可选择支持通过摇动设备重新加载数据。

于 2009-10-03T00:58:47.020 回答
0

还没有人提到过 RestKit吗?我的朋友们......说真的,你必须检查一下。如果您在 iOS(现在在 OS X)上使用 REST 做任何事情,特别是如果您想使用 Core Data ...请查看 RestKit。我在 iOS 上实现服务器和我的 Core Data 模型之间的一些相当复杂的数据同步节省了无数小时。RestKit 让它变得如此简单,几乎让你恶心。

于 2011-03-27T04:20:58.307 回答