正如你在你的计划,XML和REST已经概述是一个沟通的好方法Web应用程序。我想提出一些关于如何实际设计和构建它的细节,或者你应该记住的内容。
首先,我认为坚持使用MVC是很重要的。我见过人们在视图控制器中创建HTTP连接,控制器是NSXMLParser的委托,控制器包含成员变量中的数据。我甚至见过建立HTTP连接的UITableCells。不要这样做!
您的模型及其基本操作代码应尽可能从用户界面提取。由于您已经在Web应用程序中创建了模型,因此请尝试在iPhone项目中重新创建实体。不要害怕在实体类中使用一些简单的方法,但不要让它们使用外部资源,特别是TCP连接。作为实体类中的方法的一个例子,你可能有方法以特定的方式格式化数据(日期为例,或者返回姓氏作为名字和姓氏的连接),或者你甚至可以使用像- (void)update
这样的方法作为包装器调用负责更新模型的类。
创建另一个类来更新模型 - 从web-app获取XML。甚至不要考虑使用同步连接,甚至不要使用专用线程。与委托的异步连接是要走的路。有时需要多个请求才能获取所有必需的数据。您可能想要创建某种状态机来保存关于您处于哪个下载阶段的信息,以及从一个阶段到另一个阶段的进度,如果发生错误,则跳至末尾,在某些时刻之后从失败阶段重新执行。
暂时将数据下载到某个地方,首先当您拥有了所有数据时,请进行切换并更新用户界面。这有助于启动应用程序时的响应 - 用户可以立即使用本地存储的数据,而更新机制正在下载新数据。
如果您需要下载大量文件,请尝试同时下载它们,前提是文件之间的依赖性允许。这包括为每个请求创建一个连接,可能为每个请求实例。你当然可以只有一个委托实例用于所有这些连接,但是跟踪数据会变得更加复杂。同时下载可能会大大减少延迟,使用户的机制更快。
要节省时间和带宽,请考虑使用HTTP的If-Modified-Since
和/或ETag
标头。请记住上次请求数据时的时间或标记,并在下次使用HTTP标题发送时。如果内容尚未更改,则您的网络应用程序应返回HTTP代码304。 iPhone应用程序应在connection:didReceiveResponse:
中对此代码做出相应反应。
创建一个专用类解析XML和更新模型。你可以使用NSXMLParser,但如果你的文件不是很大,我强烈建议使用TouchXML,它很高兴使用XML作为文档(它也支持XPath),而不是基于事件的API。您也可以在下载文件时使用此解析器来检查其有效性 - 如果解析失败,请重新下载。那时专用的解析类很方便。
如果你的数据集不是很大,如果你不需要在iPhone上永久保存下载的数据,你可能不需要将它们存储在SQLite数据库中,你可以简单地将它们存储为XML格式 - 只需简单的缓存。这至少可能是一个Twitter应用程序的方式。它变得更容易,但对于更大的数据集,XML消耗大量内存和处理能力 - 在这种情况下,SQLite更好。
我建议使用核心数据,但你提到这是你的第一个iPhone应用程序,所以我建议你不要使用它。然而。
不要忘了多任务处理 - 你的应用程序可以去下载过程中睡觉,你需要取消连接,并清理你的更新机制。在应用程序唤醒时,您可能需要恢复更新。
关于应用程序的视图部分 - 使用界面生成器。一开始可能会很痛苦,但从长远来看,这是值得的。
视图控制器是模型和视图之间的粘合剂。不要在那里存储数据。考虑在什么地方实施什么,以及谁应该叫它。
这与应用程序的体系结构无关,但我想提醒一下,Objective-C是非常富有表现力的语言。代码应该看起来很像一个句子。通过协议扩展课程。作为一个例子,有一天我需要一个字符串的第一行。当然,你可以在第一次出现新行的地方写一行,并从头到尾得到一个子字符串。但它看起来不正确。我已将- (NSString*)firstLine
添加到我的NSString协议中。代码看起来好多了,它不需要任何评论。
有很多事情在这两个架构和设计任何项目的考虑,他们都应该齐头并进。如果有人给对方造成麻烦,你需要适应。没有什么是写在石头上的。
这是所有用户的SQLite数据库相同吗?还是每个用户都特定?数据库/数据在初始复制和后期获取中会占用多少? – baalexander 2010-10-15 15:34:19
SQLite数据库将托管本地化版本的提要,数据从中央mySQL数据库中提取。对于inital fetch,我想我可以控制我想要的大小,因为我可以设置多少个以前的feed项目,这些只是文本。 – barfoon 2010-10-15 15:43:58
只是一个历史性的笔记。多年来,** ASIHTTPRequest **是iOS领域中最受欢迎,最好的iOS库的解决方案!不幸的是,这些日子已经不在我们身边了,但它是特别的。啊,回忆! – Fattie 2016-03-14 14:11:56