AFNetworking有哪些主要的ASIHTTPRequestfunction?

由于ASIHTTPRequest最近停止了工作 ,似乎关注正在转向AFNetworking 。

但是,我还没有find比较两个库的function,所以我不知道如果/当我切换时可能会丢失什么。

我目前发现的主要差异是:

  1. AFNetworking有一个小得多的代码(这是很好的)
  2. AFNetworking正在迅速改进(所以它可能还不成熟,可能没有一个稳定的API呢?)
  3. 两者都似乎有caching,但我已经看到提示,因为AFNetworking使用NSURLConnection它不会caching对象超过50K
  4. ASIHTTPRequest对手动和自动(PAC)http代理有很好的支持; 我找不到AFNetworking代理服务器支持的级别
  5. AFNetworking要求iOS 4+,而ASIHTTPRequest则适用于iOS 2(对我来说不是一个问题,但这对某些人来说是一个问题)
  6. AFNetworking还没有内置的持久caching,但有一个持久的caching有一个挂起的请求: https : //github.com/gowalla/AFNetworking/pull/25

有没有人看到两个库的任何好的比较或任何logging从一个切换到另一个的经验?

我喜欢ASIHTTPRequest,我很难过看到它。 然而,ASI的开发者是正确的,ASIHTTPRequest已经变得如此庞大和臃肿,以至于他无法花时间把它与iOS和其他框架的最新特性相提并论。 我继续前进,现在使用AFNetworking。

这就是说,我必须说AFNetworking比ASIHTTP更不稳定,而且我使用它的东西需要改进。

在屏幕上显示我的结果之前,我经常需要向100个HTTP源发出HTTP请求,并且将AFHTTPNetworkOperation放入操作队列中。 在下载所有结果之前,我希望能够取消操作队列中的所有操作,然后closures包含结果的视图控制器。

这并不总是奏效。

我随机使用AFNetworking时发生崩溃,而使用ASIHTTPRequest,这个操作是完美无缺的。 我希望我能说AFNetworking的哪个特定部分崩溃,因为它在不同的点上不断崩溃(不过,大多数时候debugging器指向创buildNSURLConnection对象的NSRunLoop)。 所以,AFNetworking需要成熟才能被认为是完整的ASIHTTPRequest。

此外,ASIHTTPRequests支持客户authentication,AFNetworking此刻缺乏。 实现它的唯一方法是inheritanceAFHTTPRequestOperation并覆盖NSURLConnection的身份validation方法。 然而,如果你开始涉足NSURLConnection,你会注意到将NSURLConnection放在一个NSOperation包装器中,并且写完成块并不像听起来那么困难,你会开始思考是什么让你不能转储第三方库。

ASI使用了一种完全不同的方法,因为它使用CFNetworking(基于C的底层基础框架)来完成下载和file upload,完全跳过NSURLConnection,触及我们大多数人的概念,OS X和iOS开发者都害怕。 因此,您可以更好地上传和下载文件,甚至是网页caching。

我更喜欢哪一个? 这很难说。 如果AFNetworking足够成熟,我会比ASI更喜欢它。 在此之前,我不得不佩服ASI,以及它成为OS X和iOS最常用的框架之一。

编辑: 我认为是时候更新这个答案了,因为事情发生了变化之后这个post。

这篇文章是前段时间写的,AFNetworking已经足够成熟了。 1个月前AF发布了POST操作的一个小更新,这是我对框架的最后一次投诉(小行结束错误是因为AF上传失败,但在ASI中完成了)。 身份validation不是AFnetworking的问题,对于复杂的身份validation方法,您可以对操作进行子类化,并创build自己的调用,AFHTTPClient使基本身份validation成为一个小菜单。 通过inheritanceAFHTTPClient,您可以在很短的时间内创build一个完整的服务使用者。

更不用提AFNetworking提供的绝对必要的UIImage补充。 使用块和自定义完成块以及一些聪明的algorithm,可以非常容易地实现asynchronous映像下载和填充的表格视图,而在ASI中,您必须为带宽限制设置操作队列,并且介意按照以下方式取消和恢复操作队列表格视图的可见性,以及类似的东西。 这类行动的开发时间减半。

我也喜欢成功和失败的块。 ASI只有一个完成块(实际上是NSOperation的完成块)。 您必须检查完成时是否出现错误,并采取相应措施。 对于复杂的Web服务,您可能会迷失在所有的“ifs”和“elses”中。 在AFNetworking中,事情更加简单直观。

ASI当时非常棒,但通过自动对焦,您可以更好地改变处理Web服务的方式,并更轻松地实现可扩展的应用程序。 我真的相信没有任何理由继续坚持使用ASI,除非你想要瞄准iOS 3及以下版本。

刚刚完成一个项目,我正在使用AFNetworking而不是ASI。 在以前的项目中使用过ASI; 这在过去是一个很大的帮助。

以下是AFNetworking错过(截至今天),你应该知道:

  • 没有

ASI 正在离开 。 现在使用AF。 它很小,工作,并将继续得到支持。 它也是更符合逻辑的组织,特别是API客户端。 它有许多很棒的类,用于经常使用的特殊情况,比如在表视图中asynchronous加载图像。

AFNetworking不支持TLS客户端身份validation的clientCertificateIdentity和clientCertificates。

我们可以通过- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge在AFURLConnectionOperation的子类中- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge方法,但这并不容易。

我已经使用了ASI *了一段时间了,我非常喜欢ASI的fileupload方法,虽然我很兴奋地跳到AFNetworking,但是AfNetworking中的fileupload支持与ASI *相比并不是那么容易使用。

到目前为止,我无法弄清楚如何设置与AFNetworking在执行同步POST请求超时更新:我终于想通了: https : //stackoverflow.com/a/8774125/601466
现在切换到AFNetworking:]

==================

Apple会覆盖POST的超时时间,将其设置为240秒 (如果设置的时间更短,则240秒),并且不能更改。 使用ASIHTTP你只需设置一个超时时间,它就可以工作。

具有同步POST请求的代码示例:

 NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys: @"doSomething", @"task", @"foo", @"bar", nil]; AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:baseURL]]; NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" path:requestURL parameters:params]; [httpClient release]; AFHTTPRequestOperation *operation = [[[AFHTTPRequestOperation alloc] initWithRequest:request] autorelease]; [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {} failure:^(AFHTTPRequestOperation *operation, NSError *error) { NDLog(@"fail! %@", [error localizedDescription]); }]; NSOperationQueue *queue = [[[NSOperationQueue alloc] init] autorelease]; [[AFNetworkActivityIndicatorManager sharedManager] incrementActivityCount]; [queue addOperation:operation]; [queue waitUntilAllOperationsAreFinished]; // Stuck here for at least 240 seconds! [[AFNetworkActivityIndicatorManager sharedManager] decrementActivityCount]; if (![[operation responseString] isEqualToString:@""]) { return [operation responseString]; } return nil; 

我试图在这里设置超时,但没有任何工作。 这个问题使我无法迁移到AFNetworking。

另请参阅此处: 如何使用AFNetworking设置超时

AFNetwork缺乏上传大文件的能力。 它假定文件内容在RAM中。 ASI足够聪明,可以简单地从磁盘传输文件内容。

在ASIHTTP,我喜欢我可以附加一个用户信息字典个别请求。 据我AFHTTPRequestOperation ,在AFHTTPRequestOperation没有直接的支持。 有没有人提出了一个优雅的解决方法呢? 当然除了微不足道的子类。

AFNetworking与“块”的工作,这是比ASIHTTPRequest代表工作更自然。

使用块就像在javascript中使用匿名函数一样。