我非常喜欢ASIHTTPRequest,很遗憾它已经停止更新了。但是ASI的开发者说得没错,ASI已经变得过于庞大臃肿,即使他也无法抽出时间来将其与最新的iOS和其他框架保持同步。我现在使用AFNetworking。
尽管如此,我必须说,相比于ASIHTTP,AFNetworking更不稳定,并且在我使用它进行的某些操作中需要改进。
我经常需要在显示结果之前向100个HTTP源发起HTTP请求,并将AFHTTPNetworkOperation放入操作队列中。在下载所有结果之前,我希望能够取消操作队列中的所有操作,然后关闭持有结果的视图控制器。
但这并不总是有效。
使用AFNetworking时,在随机一些时间会崩溃,而对于ASIHTTPRequest,这些操作可以完美地运行。我希望我能够确定AFNetworking中导致崩溃的具体部分,因为它总是在不同的点崩溃(然而,大多数情况下调试器指向创建NSURLConnection对象的NSRunLoop)。所以,AFNetworking需要成熟才能像ASIHTTPRequest一样完整。
此外,ASIHTTPRequests支持客户端身份验证,而AFNetworking目前缺乏此功能。唯一的实现方法是子类化AFHTTPRequestOperation并覆盖NSURLConnection的身份验证方法。但是,如果你开始涉足NSURLConnection,你会发现将NSURLConnection放入NSOperation包装器并编写完成块并不像听起来那么难,并且你会开始考虑要不要放弃第三方库。
ASI使用了一种完全不同的方法,因为它使用CFNetworking(基于C的低级基础框架)实现了下载和文件上传,完全跳过了NSURLConnection,并触及大多数我们这些OS X和iOS开发人员害怕的概念。正因为如此,你可以获得更好的文件上传和下载,甚至是网页缓存。
我更喜欢哪一个呢?很难说。如果AFNetworking成熟了,我会比ASI更喜欢它。在此之前,我只能欣赏ASI,以及它成为OS X和iOS历史上最常用的框架之一的方式。
我认为现在是更新这篇答案的时候了,因为此贴发布后事情有点变化。
这篇文章写于一段时间前,AFNetworking 已经足够成熟。1-2个月前,AF发布了一个关于 POST 操作的小更新,这是我对框架的最后一点抱怨(一个小行尾错误是导致 echonest 上传失败的原因,但使用 ASI 没问题)。对于 AFnetworking,身份验证不是问题,对于复杂身份验证方法,您可以子类化操作并进行自己的调用,AFHTTPClient 让基本身份验证变得轻而易举。通过子类化 AFHTTPClient,您可以在很短的时间内制作整个服务消费者。
更不用说 AFNetworking 提供的非常必要的 UIImage 添加功能了。利用块和自定义完成块以及一些聪明的算法,您可以相当容易地制作具有异步图像下载和单元格填充的表视图,而在 ASI 中,您需要制作操作队列以实现带宽限制,并自行取消和恢复操作队列,根据表视图的可见性进行操作,等等。这样的操作开发时间已经减半。
我也喜欢成功和失败块。ASI 只有一个完成块(实际上是 NSOperation 的完成块)。您必须在完成时检查是否有错误并相应地采取行动。对于复杂的 Web 服务,您可能会在所有“如果”和“否则”中迷失方向;在 AFNetworking 中,事情要简单得多,也更加直观。
ASI 在其时代是很棒的,但是通过 AF,您可以以好的方式彻底改变您处理 Web 服务的方式,并更轻松地制作可扩展的应用程序。我真的相信,除非您想针对 iOS 3 及以下版本,否则没有任何理由再坚持使用 ASI。
ASIFallbackToCacheIfLoadFailsCachePolicy
非常好用。而且,我认为AFNetworking没有持久缓存支持,这对我来说是不能接受的。 - iwatNSURLCache
。如果您正在寻找磁盘缓存,我强烈建议使用Peter Steinberger的SDURLCache分支。 - mattt