iphone - 发出许多网络请求的 iOS 应用程序的最佳架构?

标签 iphone objective-c cocoa-touch network-programming asihttprequest

我正在重新考虑我正在开发的大型应用的请求架构的方法。我目前正在使用 ASIHTTPRequest 来实际发出请求,但是由于在不同的 View Controller 中采取了许多不同的操作,我需要许多不同类型的请求,因此我正在尝试找出组织这些请求的最佳系统。

我目前正在构建由应用程序委托(delegate)保留的单例“请求者”,并坐在那里监听表示需要发出请求的 NSNotification;他们发出请求,监听响应,并发送一个带有响应数据的新 NSNotification。这解决了我的大部分问题,但不能优雅地处理失败的请求或对同一个单例请求者的并发请求。

是否有人成功设计了一个清晰的 OO 架构以在 iOS 应用程序中发出许多不同类型的请求?

最佳答案

在尝试了几种方法之后,这是一种给我带来出色结果的架构,易于记录、理解、维护和扩展:

  • 我有一个负责网络连接的对象,我们称它为“网络管理器”。通常这个对象是一个单例(使用 Matt Gallagher's Cocoa singleton macro 创建)。
  • 由于您使用 ASIHTTPRequest(我总是这样做,很棒的 AP​​I),我在网络管理器中添加了一个 ASINetworkQueue ivar。我让网络管理员成为该队列的代表。
  • 我为我的应用所需的每种网络请求(通常为每个后端 REST 交互或 SOAP 端点)创建 ASIHTTPRequest 的子类。这还有另一个好处(详情见下文:)
  • 每次我的 Controller 需要一些数据(刷新、viewDidAppear 等)时,网络管理器都会创建所需 ASIHTTPRequest 子类的实例,然后将其添加到队列中。
  • ASINetworkQueue 负责处理带宽问题(取决于您使用的是 3G、EDGE 还是 GPRS 或 Wifi,您拥有更多带宽,并且可以处理更多请求等)。这是由队列完成的,这很酷(至少,这是我理解这个队列所做的事情之一,我希望我没有弄错:)。
  • 每当请求完成或失败时,都会调用网络管理器(请记住,网络管理器是队列的代表)。
  • 网络管理员不知道如何处理每个请求的结果;因此,它只是在请求上调用一个方法!请记住,请求是 ASIHTTPRequest 的子类,因此您可以只放置管理请求结果的代码(通常,将 JSON 或 XML 反序列化为真实对象,触发其他网络连接,更新 Core Data 存储等)。将代码放入每个单独的请求子类中,使用跨请求类的通用名称的多态方法,可以很容易地调试和管理恕我直言。
  • 最后,我使用通知通知上面的 Controller 有趣的事件;使用委托(delegate)协议(protocol)不是一个好主意,因为在您的应用中,您通常有许多 Controller 与您的网络管理员通信,然后通知更加灵活(您可以让多个 Controller 响应相同的通知等)。

无论如何,这就是我一段时间以来一直这样做的方式,坦率地说,它运作良好。我可以横向扩展系统,根据需要添加更多的 ASIHTTPRequest 子类,并且网络管理器的核心保持不变。

希望对你有帮助!

关于iphone - 发出许多网络请求的 iOS 应用程序的最佳架构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4810289/

相关文章:

objective-c - 将 NSNumber 存储为 long double 类型

objective-c - 使按钮能够被拖放

iphone - iTunesConnect 崩溃日志已部分符号化;不显示行号

iphone - 比较 google place API mapPoints 与核心数据对象 mapPoints - mapView

iphone - 如何使 ios 设置包(PreferenceLoader)中的特定单元格变灰?

ios - 如何在 iOS 中为通用应用程序添加新的 XIB 文件?

ios - 开发过程中应该如何使用identifierForVendor?

jquery - 响应式菜单 - 防止悬停,改用点击

ios - 按下物理音量键时如何触发iOS音量 View

ios - NSLog 的奇怪行为