93

由于最近停止了 ASIHTTPRequest 的工作,似乎注意力正在转移到AFNetworking 上

但是,我还没有很好地比较这两个库的功能,所以我不知道如果/当我切换时我可能会失去什么。

到目前为止,我发现的主要区别是:

  1. AFNetworking 的代码量要小得多(这很好)
  2. AFNetworking 正在快速改进(所以它可能还不成熟,可能还没有稳定的 API?)
  3. 两者似乎都有缓存,尽管我已经看到提示,因为 AFNetworking 使用NSURLConnection 它不会缓存超过 50K 的对象
  4. ASIHTTPRequest 对手动和自动 (PAC) http 代理有很好的支持;我找不到任何有关 AFNetworking 对代理的支持级别的信息
  5. AFNetworking 需要 iOS 4+,而 ASIHTTPRequest 可以在 iOS 2 上运行(对我来说不是问题,但对某些人来说是个问题)
  6. AFNetworking(还)没有内置的持久缓存,但是有一个持久缓存有一个待处理的拉取请求:https ://github.com/gowalla/AFNetworking/pull/25

有没有人看过这两个库的任何很好的比较或任何从一个库切换到另一个库的记录经验?

4

8 回答 8

59

我喜欢 ASIHTTPRequest,看到它消失我很难过。然而,ASI 的开发者是对的,ASIHTTPRequest 已经变得如此庞大和臃肿,甚至他都无法花时间将其与 iOS 和其他框架的最新功能相提并论。我继续前进,现在使用 AFNetworking。

也就是说,我必须说 AFNetworking 比 ASIHTTP 不稳定得多,对于我使用它的东西,它需要改进。

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

这并不总是有效的。

我在使用 AFNetworking 时会随机崩溃,而使用 ASIHTTPRequest 时,此操作可以完美运行。我希望我能说出 AFNetworking 的哪个特定部分正在崩溃,因为它一直在不同的点崩溃(但是,大多数情况下,调试器指向创建 NSURLConnection 对象的 NSRunLoop)。因此,AFNetworking 需要成熟才能被认为与 ASIHTTPRequest 一样完整。

此外,ASIHTTPRequests 支持客户端身份验证,这是 AFNetworking 目前缺乏的。实现它的唯一方法是继承 AFHTTPRequestOperation 并覆盖 NSURLConnection 的身份验证方法。但是,如果您开始参与 NSURLConnection,您会注意到将 NSURLConnection 放在 NSOperation 包装器中并编写完成块并不像听起来那么难,并且您会开始思考是什么阻止了您转储 3rd 方库。

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 服务,您可能会迷失在所有的“ifs”和“else”中;在 AFNetworking 中,事情变得更加简单和直观。

ASI 在当时非常出色,但是使用 AF,您可以以一种很好的方式完全改变您处理 Web 服务的方式,并更轻松地制作可扩展的应用程序。我真的相信没有任何理由再坚持使用 ASI,除非您想针对 iOS 3 及更低版本。

于 2011-12-04T17:21:14.033 回答
17

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

以下是您应该了解的 AFNetworking 缺失的内容(截至今天):

  • 没有

ASI即将消失。现在使用自动对焦。它很小,很有效,并且会继续得到支持。它的组织也更有逻辑,特别是对于 API 客户端。它有许多很棒的类,用于经常使用的特殊情况,例如在表格视图中异步加载图像。

于 2011-09-29T22:38:28.670 回答
4

AFNetworking 不支持用于 TLS 客户端身份验证的 clientCertificateIdentity 和 clientCertificates。

我们可以使用- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challengeAFURLConnectionOperation 的子类中的方法来做到这一点,但这并不容易。

于 2011-11-07T17:09:18.167 回答
2

我使用 ASI* 已经有一段时间了,我非常喜欢 ASI 的文件上传方法,虽然我很高兴跳到 AFNetworking,但与 ASI* 相比,AfNetworking 中的文件上传支持并不容易使用。

于 2011-10-10T03:13:42.100 回答
2

到目前为止,我无法弄清楚在执行同步 POST 请求时如何使用 AFNetworking 设置超时更新:我终于想通了: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 设置超时

于 2012-01-03T14:26:28.333 回答
2

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

于 2012-04-18T05:34:04.100 回答
0

在 ASIHTTP 中,我喜欢我可以将用户信息字典附加到单个请求中。据我所知,在AFHTTPRequestOperation. 有没有人想出一个优雅的解决方法?当然,除了琐碎的子类化。

于 2012-11-30T11:11:59.317 回答
-8

AFNetworking 使用“块”,这对我来说比使用像 ASIHTTPRequest 这样的代表更自然。

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

于 2011-09-27T15:18:35.080 回答