我应该如何构建我的iPhone应用程序来与我的网站交谈?

bar*_*oon 19 architecture iphone web-services ios4

我正在计划我的第一个iPhone应用程序,我想从一开始就得到一些关于如何构建它的输入.iPhone应用程序正在与面向公众的Web应用程序配合使用,该应用程序已经用PHP构建.

我希望网络平台成为核心(数据存储在mySQL数据库中),并让iPhone客户端与它通信并使用REST'方法来执行网站功能(获取最新内容,发布内容,投票) ,帐户管理作为例子).

我希望客户在SQLite数据库中获取数据的本地副本,但刷新以获取最新版本的feed(类似于Twitter应用程序).

我现在有几个想法:

  • 使用ASIHTTPRequest之类的东西将数据发送/接收到侦听请求的服务器上的PHP文件

  • JSON - 我最好将GET/POSTS发送到返回JSON对象的PHP,并使用某种管理数据并将更改传递给本地SQLite数据库的包装器?

  • 我完全不知道应该如何构建这个与网络通信的东西?这是最好的做法吗?

我非常感谢您如何构建这种设置.

谢谢,

编辑:再次阅读我自己的帖子后,我知道它听起来像一个Twitter客户端,但它不是,虽然它有类似的功能/结构的Twitter类型设置.谢谢!

Mic*_*hal 17

正如您在计划中已经概述的那样,XML和REST是与Web应用程序通信的好方法.我想建议一些关于如何实际设计和构建它的细节,或者你应该记住什么.

首先,我认为坚持使用MVC非常重要.我见过人们在视图控制器中创建HTTP连接,控制器是NSXMLParser的委托,控制器包含成员变量中的数据.我甚至看到UITableCells建立HTTP连接.不要这样做!

您的模型及其基本操作代码应尽可能从用户界面中提取.由于您已在Web应用程序中创建了模型,请尝试在iPhone项目中重新创建实体.不要害怕在实体类中使用一些简单的方法,但不要让它们使用外部资源,尤其是tcp连接.作为实体类中方法的一个示例,您可能拥有以特定方式格式化数据的方法(日期作为示例,或返回fullname作为firstname和surname的串联),或者您甚至可以使用类似的方法- (void)update作为包装器call class负责更新模型.

创建另一个用于更新模型的类 - 从web-app中获取XML.甚至不考虑使用同步连接,甚至不使用专用线程.与委托的异步连接是要走的路.有时需要多个请求来获取所有必需的数据.您可能希望创建某种状态机来保存有关下载哪个阶段的信息,以及从一个阶段到另一个阶段的进度,如果发生错误则跳到最后,在一段时间后从失败的阶段重新执行.

暂时在某处下载数据,首先在完成所有操作后,进行切换并更新用户界面.这有助于在启动应用程序期间的响应性 - 用户可以立即使用本地存储的数据工作,而更新机制正在下载新数据.

如果您需要下载大量文件,请尝试同时下载它们,如果文件之间的依赖关系允许的话.这涉及为每个请求创建一个连接,可能为每个请求委托实例.当然,对于所有这些连接,您只能有一个委托实例,但跟踪数据会有点复杂.同时下载可能会大大减少延迟,使用户的机制更快.

要节省时间和带宽,请考虑使用HTTP If-Modified-Since和/或ETag标头.记住上次请求数据时的时间或标记,下次将其发送到HTTP的标题中.如果内容尚未更改,您的Web应用程序应返回HTTP代码304.iPhone应用程序应相应地对此代码作出反应connection:didReceiveResponse:.

创建一个专用类来解析XML并更新模型.您可以使用NSXMLParser,但如果您的文件不是很大,我强烈推荐使用TouchXML,很高兴使用XML作为文档(它也支持XPath),而不是基于事件的API.您还可以在下载文件时使用此解析器来检查其有效性 - 如果解析失败则重新下载.那时解析的专用类很方便.

如果你的数据集不是很大,如果你不需要永久地在iPhone上保存下载的数据,你可能不需要将它们存储在SQLite数据库中,你可以简单地将它们存储为XML格式 - 只是一个简单的缓存.这至少可能是推特应用程序的方式.这种方式变得更容易,但对于更大的数据集,XML会占用大量内存和处理能力 - 在这种情况下,SQLite会更好.

我建议使用Core Data,但你提到这是你的第一个iPhone应用程序,所以我建议你不要使用它.然而.

不要忘记多任务处理 - 您的应用程序可以在下载过程中进入休眠状态,您需要取消连接并清理更新机制.在应用程序唤醒时,您可能希望恢复更新.

关于应用程序的视图部分 - 使用Interface Builder.它可能在开始时很痛苦,但从长远来看它会得到回报.

视图控制器是模型和视图之间的粘合剂.不要在那里存储数据.三思而后行,在哪里实施,谁应该称之为.

这与应用程序的体系结构无关,但我想提醒一下,Objective-C是一种非常富有表现力的语言.代码应该像句子一样阅读.使用协议扩展类.作为一个例子,有一天我需要第一行字符串.当然,你可以写一个单行,你会发现第一次出现一个新行,并从头到那里得到一个子串.但它看起来并不正确.我已添加- (NSString*)firstLine到我的NSString协议中.Code以这种方式看起来好多了,它不需要任何评论.

在任何项目的架构和设计中都要考虑很多事情,它们都应该齐头并进.如果一个人给另一个人造成麻烦,你需要适应.没有什么是一成不变的.