使用 WebService 更新 TableView 并保存到 CoreData
Posted
技术标签:
【中文标题】使用 WebService 更新 TableView 并保存到 CoreData【英文标题】:Updating a TableView with a WebService and Saving to CoreData 【发布时间】:2010-05-18 01:34:28 【问题描述】:我正在做一个项目,我有一个表视图,该表视图当前通过返回 XML 的 Web 请求进行更新。我实现了
-(int)numberOfRowsInTableView:(NSTableView*)tv
和
-(id)tableView:(NSTableView *)tv objectValueForTableColumn:(NSTableColumn*)tableColumn row:(int)row
在我的 XML 解析类中,并使用从服务器下拉的数据更新表。
我想保存使用 Core Data 下拉的数据,以便可以保存/加载表格。然后稍后在发出 Web 请求时启动应用程序,它只会添加尚未存在的数据。 (XML 是按发布日期排序的,所以稍后我会检查哪些发布日期没有从 Core Data 存储中加载,并且只加载较新的条目。)
我将如何实现这一点?我是一个非常新的 Cocoa 开发人员,但已经阅读了整个 Hillegass 书。非常感谢。
【问题讨论】:
【参考方案1】:您在这里讨论的主要内容有两个:解析 XML,以及使用 Core Data 进行持久性。
(1) 我在 NSXMLParser 周围使用 this wrapper 读取 XML 文件取得了一些成功。我听说过但没有使用过更新的库,但这可能会为您提供一个起点。链接的文章非常详尽地介绍了用法。
(2) 使用 Core Data 做的第一件事是创建一个新的数据模型。从那里,您可以创建一个模型类(带有@dynamic
属性),以便通过Core Data 轻松地与您的数据库进行交互(使用诸如NSManagedObjectContext 之类的东西)。你可以得到一个温和的介绍here,或者进一步了解here。
实施核心数据并非易事,尤其是对于新开发人员而言。我鼓励您寻找有关特定主题的教程。
【讨论】:
感谢您的建议。现在我有一些工作,但我觉得我正在以一种非常古老的方式使用 Core Data(创建托管对象,设置它们的值,使用谓词搜索来获取我需要的对象......)。我认为使用@dynamic 属性可以简化我现在正在做的事情。 动态属性是有用的简写,在某种意义上类似于合成属性。你所描述的不一定听起来很古老。无论如何,您都必须编写一些胶水代码来将对象从 XML 描述转换为 Core Data 中的托管实体,这听起来像您的方法。 Mac 程序员(例如提问者)不需要该包装器,因为 Cocoa 与 Cocoa Touch 不同,它已经有一个 NSXMLNode 类。 developer.apple.com/mac/library/documentation/Cocoa/Reference/…【参考方案2】:我现在和你在同一条船上 - 我只是在学习 Cocoa,我已经阅读了 Hillegass 的书,并且我正在构建一个从 Web 服务中提取的 Core Data 应用程序。我已经想出了如何让我的应用程序成功地从 Web 服务填充表格视图,但我不知道我正在做的方式是正确的方式还是最佳实践。这是我所做的:
我创建了一个核心数据模型,它与来自 Web 服务的实体具有相同的属性。在 Interface Builder 中,我创建了一个表视图并设置了表列和 Core Data 属性之间的绑定。当应用程序启动时,我从 Web 服务中提取数据,遍历项目并创建新实体。然后表格视图会自动识别新数据并自行填充。
Core Data book from Pragmatic Programmers,以及这个问题都帮助了我: JSON to Persistent Data Store (CoreData, etc.)
我还没有解决同步问题(添加新项目、更新现有项目),但我已将此文档添加为书签: http://developer.apple.com/Mac/library/documentation/Cocoa/Conceptual/CoreData/Articles/cdImporting.html#//apple_ref/doc/uid/TP40003174
【讨论】:
感谢您的提示。根据这里的答案和我阅读的一些教程,我正在做类似的事情。我正在遍历 XML 节点并创建适当的托管对象。以上是关于使用 WebService 更新 TableView 并保存到 CoreData的主要内容,如果未能解决你的问题,请参考以下文章