2011-09-23 248 views
93

随着work having recently stopped on ASIHTTPRequest,它似乎注意力转移到AFNetworkingAFNetworking主要的ASIHTTPRequest功能是什么?

不过,我还没有发现的两个库的功能比较不错,所以我不知道是什么,如果/当我切换我可能会失去。

到目前为止,我发现

主要区别在于:

  1. AFNetworking具有小得多的代码大小(这是好的)
  2. AFNetworking正在迅速提高(所以它可能尚未成熟,可能没有一个稳定的API尚未)
  3. 似乎都具有缓存,虽然我已经看到提示,由于AFNetworking使用NSURLConnection it won't cache objects over 50K
  4. ASIHTTPRequest具有手动&自动(PAC很好的支持),HTTP代理?;我找不到
  5. AFNetworking需要iOS 4+上有什么级别的支持AFNetworking为代理的任何信息,而ASIHTTPRequest工程右后卫的iOS 2(不是真的适合我的问题,但它是对某些人的问题)
  6. AFNetworking没有(还)有一个内置的持久性高速缓存,但有其中有一个未决的拉动请求持久性高速缓存:https://github.com/gowalla/AFNetworking/pull/25

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

+0

AFNetworking缺乏非常详细的文档和示例,所以我不能多说这些。我使用ASIHTTPRequest的主要原因是因为它支持iOS 3.0和'ASIFallbackToCacheIfLoadFailsCachePolicy'非常好。而且,我认为AFNetworking没有持久的缓存支持。这对我来说是不行的。 – iwat

+0

只需注意您是第一个用'afnetworking'标记问题的人。 – iwat

+0

有一个等待被拉入AFNetworking的缓存,我在我的问题中添加了一个链接。 – JosephH

回答

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个月前AF发布了POST操作的一个小更新,这是我对框架的最后一次投诉(小行结束错误是因为AF上传失败,但在ASI中完成正常)。身份验证不是AF网络的问题,对于复杂的身份验证方法,您可以对操作进行子分类并创建自己的呼叫,AFHTTPClient使基本身份验证成为小菜一碟。通过继承AFHTTPClient,您可以在很短的时间内创建一个完整的服务使用者。

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

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

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

+1

+1非常有益。也许这是值得张贴您的崩溃作为一个问题在stackoverflow?我很想看到更多的细节。 – JosephH

+0

谢谢。当我有关于崩溃的具体数据时,我会这样做。 – csotiriou

+3

稳定性问题仍然是一个问题? –

-9

AFNetworking作品以“块”,这是更自然的对我来说比像ASIHTTPRequest做代表的工作。

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

+9

ASIHTTPRequest也接受块 – hypercrypt

+0

是真的,但在我看来,它不是用ASIHTTPRequest开发的主要方法 – torhector2

+7

这只是因为在写入ASIHTTP之后块出现了,我总是使用ASI块而不是委托。 – hypercrypt

17

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

这里的AFNetworking缺失(今天的),你应该知道什么:

  • 没有

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

+9

由于@iwat在问题的逗号中提到,AFNetworking缺少健壮的缓存。这个问题很有意思,所以“无”是错误的答案。除此之外,我完全同意你的观点,寿。 –

+1

@KennyWinker请在该评论主题中看到我的回复。我很高兴地说,AFNetworking不会通过设计构建缓存。相反,可以自由交换他们最喜欢的基于NSURLCache的解决方案。 – mattt

+1

没有任何部分 - 我如何在请求中使用代理? –

2

我一直在使用ASI *一段时间了,我绝对喜欢ASI的fileupload方法,尽管我很兴奋能跳到AFNetworking,但与AfIworking相比,AfNetworking中的fileupload支持并不像ASI *那样容易使用。

4

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

我们可以做到这一点,在AFURLConnectionOperation的子类的- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge方法,但它不是那么容易。

+5

你现在可以在'AFURLConnectionOperation'及其子类上执行'setAuthenticationChallengeBlock:',并传递逻辑来处理您需要的任何身份验证挑战,无需子类。 – mattt

2

直到现在我无法弄清楚如何做一个同步POST请求时设置的超时与AFNetworking。 UPDATE:我终于想出: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

+0

你有关超时的观点很好,谢谢分享!我不明白这与如何同步请求有关,你可以扩展吗? – JosephH

+0

@JosephH你是对的。当然,有时您在执行异步请求时也需要设置超时时间。我已经更新了我的答案:] – borisdiakur

+0

@JosephH再次用代码示例更新我的答案。 – borisdiakur

2

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

0

在ASIHTTP中,我喜欢我可以将userinfo字典附加到单个请求中。据我所知,AFHTTPRequestOperation没有直接的支持。有没有人提出了一个优雅的解决方法呢?当然除了微不足道的子类。

+2

不要在答案中提问,你获得反应的机会非常低。改用评论或新问题;) – Michal