使用work having recently stopped on ASIHTTPRequest,注意力似乎转移到AFNetworking。
但是,我还没有找到两个库的功能的良好比较,所以我不知道如果/当我切换时我可能会失去什么。
到目前为止,我发现的主要差异是:
有没有人看到两个图书馆的任何良好比较,或者从一个图书馆转换到另一个图书馆的任何记录经验?
答案 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。
答案 5 :(得分:2)
AFNetwork无法上传大文件。它假设文件内容在RAM中。 ASI非常聪明,可以简单地从磁盘传输文件内容。
答案 6 :(得分:0)
在ASIHTTP中,我喜欢将userinfo字典附加到各个请求中。据我所知,在AFHTTPRequestOperation
中没有直接的支持。有没有人想出一个优雅的解决方法呢?当然,除了琐碎的子类化。
答案 7 :(得分:-8)
AFNetworking使用“块”,这对我来说比使用像ASIHTTPRequest这样的代表更自然。
使用块就像在javascript中使用匿名函数一样。