我正在重新思考我正在开发的大型应用程序的请求架构.我目前正在使用ASIHTTPRequest来实际发出请求,但由于在不同的视图控制器中执行了许多不同的操作,因此我需要许多不同类型的请求,因此我正在try 制定组织这些请求的最佳系统.

我目前正在构建由应用程序代理保留的单例"请求者",并坐在那里倾听NSN通知,通知需要发出请求;他们发出请求,监听响应,并发送带有响应数据的新通知.这解决了我的大部分问题,但不能优雅地处理失败的请求或对同一个单例请求者的同时请求.

有谁能成功设计出一个清晰的面向对象架构,在iOS应用程序中发出多种不同类型的请求?

推荐答案

在try 了几种方法后,这是一种给我带来优异结果的体系 struct ,易于记录、理解、维护和扩展:

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

不管怎样,这就是我一直在做的事情,坦白地说,它工作得很好.我可以水平扩展系统,根据需要添加更多ASIHTTPRequest子类,而network manager的核心保持不变.

希望有帮助!

Objective-c相关问答推荐

OCUnit 的单元测试示例

使用自动布局自定义纵横比

从 C# 到 Objective C 会有多大的飞跃

NSBundle pathForResource 为 NULL

Xcode 是否支持区域?

在objective-c中isa是什么意思?

如何将 NSDate 转换为今天、昨天、一周前、一个月前、一年前等相对格式?

在 iOS 设备上本地存储图像

`-fembed-bitcode` 和 BITCODE_GENERATION_MODE 有什么区别?

使用 NSMutableArray 的二维数组

NSString:从字符串中删除 UTF-8 重音的简单方法?

UIBezierPath 减go 路径

在 NSArray 中查找最大数值

iOS Buttons - 添加边框

获取临时目录中文件的文件路径和 URL

在 iOS UILabel 上设置 BOLD 字体

BOOL到 NSString

如何在今天午夜获取 NSDate 对象?

如何根据按钮按下重新加载/刷新 UIPickerView(带有新数据数组)?

Objective-C:如何向 NSURL 添加查询参数?