AFNetworking缺少哪些主要的ASIHTTPRequest功能?

时间:2011-09-23 12:54:39

标签: iphone ios ipad asihttprequest afnetworking

使用work having recently stopped on ASIHTTPRequest,注意力似乎转移到AFNetworking

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

到目前为止,我发现的主要差异是:

  1. AFNetworking的代码大小要小得多(这很好)
  2. AFNetworking正在迅速改进(所以可能尚未成熟,可能还没有稳定的API?)
  3. 两者似乎都有缓存,但我看到提示,因为AFNetworking使用NSURLConnection it won't cache objects over 50K
  4. ASIHTTPRequest对手册和附件有很好的支持。自动(PAC)http代理;我无法找到有关AFNetworking对代理服务器支持程度的任何信息
  5. AFNetworking需要iOS 4+,而ASIHTTPRequest可以直接使用iOS 2(对我来说不是真正的问题,但对某些人来说这是一个问题)
  6. AFNetworking(还)没有内置的持久性缓存,但是有一个持久缓存,它有一个待处理的拉取请求:https://github.com/gowalla/AFNetworking/pull/25
  7. 有没有人看到两个图书馆的任何良好比较,或者从一个图书馆转换到另一个图书馆的任何记录经验?

8 个答案:

答案 0 :(得分: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包装器中并编写完成块并不像听起来那么难,您将开始考虑是什么阻止您转储第三方库。

ASI使用了一种完全不同的方法,因为它使用CFNetworking(基于C的低级基础框架)来实现下载和文件上传,完全跳过NSURLConnection,并触及概念我们大多数OS X和iOS开发人员都太害怕至。因此,您可以获得更好的文件上载和下载,甚至是网页缓存。

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

修改 我认为现在是时候更新这个答案了,因为在这篇帖子之后情况发生了一些变化。

这篇文章是在不久前写的,AFNetworking已经足够成熟。 1-2个月前AF发布了POST操作的一个小更新,这是我对该框架的最后一次抱怨(一个小的线路结束故障是由于AF最终上传失败但是ASI完成的原因)。身份验证不是AFnetworking的问题,因为对于复杂的身份验证方法,您可以将操作子类化并进行自己的调用,而AFHTTPClient使基本身份验证变得轻而易举。通过子类化AFHTTPClient,您可以在很短的时间内创建整个服务使用者。

更不用说AFNetworking提供的绝对必要的UIImage添加。使用块和自定义完成块以及一些聪明的算法,您可以非常轻松地创建具有异步图像下载和单元格填充的表视图,而在ASI中,您必须为带宽限制创建操作队列,并且根据自己的意愿取消和恢复操作队列。表视图可见性,以及类似的东西。这种行动的开发时间减少了一半。

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

ASI当时很棒,但通过AF,您可以完全改变处理Web服务的方式,并且可以更轻松地制作可扩展的应用程序。我真的相信没有任何理由坚持使用ASI,除非你想要定位iOS 3及以下版本。

答案 1 :(得分:17)

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

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

  • 没有

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

答案 2 :(得分:4)

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

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

答案 3 :(得分:2)

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

答案 4 :(得分:2)

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

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

Apple overrides the timeout for a POST, setting it to 240 seconds(如果设置的时间短于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。

另见:How to set a timeout with AFNetworking

答案 5 :(得分:2)

AFNetwork无法上传大文件。它假设文件内容在RAM中。 ASI非常聪明,可以简单地从磁盘传输文件内容。

答案 6 :(得分:0)

在ASIHTTP中,我喜欢将userinfo字典附加到各个请求中。据我所知,在AFHTTPRequestOperation中没有直接的支持。有没有人想出一个优雅的解决方法呢?当然,除了琐碎的子类化。

答案 7 :(得分:-8)

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

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