ChatGPT解决这个技术问题 Extra ChatGPT

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

对于 work having recently stopped on ASIHTTPRequest,注意力似乎转移到了 AFNetworking

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

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

AFNetworking 的代码量要小得多(这很好) AFNetworking 正在迅速改进(所以它可能还不成熟,可能还没有稳定的 API?)两者似乎都有缓存,尽管我已经看到了一些提示,因为 AFNetworking使用 NSURLConnection 它不会缓存超过 50K 的对象 ASIHTTPRequest 对手动和自动 (PAC) http 代理有很好的支持;我找不到任何关于 AFNetworking 对代理的支持级别的信息t(还)有一个内置的持久缓存,但是有一个持久缓存有一个挂起的拉取请求:https://github.com/gowalla/AFNetworking/pull/25

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

AFNetworking 缺乏非常详细的文档和示例,所以我不能说太多。我使用 ASIHTTPRequest 的主要原因是它支持 iOS 3.0 并且 ASIFallbackToCacheIfLoadFailsCachePolicy 非常好。而且,我认为 AFNetworking 没有持久缓存支持。这对我来说是不行的。
请注意,您是第一个用 afnetworking 标记问题的人。
有一个缓存等待被拉入 AFNetworking,我在我的问题中添加了一个链接。
@iwat AFNetworking 完全支持 NSURLCache。如果您正在寻找磁盘缓存,我强烈建议您使用 Peter Steinberger's SDURLCache fork
你试过我的网络框架 MKNetworkKit 吗? blog.mugunthkumar.com/products/… 基本、摘要和 NTLM 身份验证、自动缓存、内置图像缓存、超级简单的文件上传支持、出色的文档是其中的一些优点。

a
alanlo

我喜欢 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 及更低版本。


+1 非常有见地。也许值得将您的崩溃作为一个问题发布在 stackoverflow 上?我有兴趣看到更多细节。
谢谢。当我有关于崩溃的具体数据时,我会这样做。
稳定性问题仍然是一个问题吗?
根据我几天前运行的测试的初步数据,没有。它不是。但是,即使使用最新版本的框架,我也有一个示例,当在某些条件下(立即分配/取消/解除分配/重新分配/启动)对一系列操作施加足够的压力时,它有时会在 AFURLConnection 的运行循环上崩溃。它必须与 NSOperation 完成块和 NSRunLoop 有关。我检查了 AFNetworking 的实现,但找不到原因。
ASI 确实有一个故障块。
J
Jeff

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

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

没有什么

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


正如@iwat 在问题的评论中提到的那样,AFNetworking 缺少强大的缓存。这很有趣并且与问题相关,所以“没有”是错误的答案。除此之外,我完全同意你的观点,寿。
@KennyWinker 请在该评论线程中查看我的回复。我很高兴地说 AFNetworking 没有在设计上构建缓存。相反,人们可以自由地更换他们最喜欢的基于 NSURLCache 的解决方案。
什么都没有 - 我如何在请求中使用代理?
@AlexVolovoy 您可能最好将其作为一个新问题提出
我不会说“什么都没有”。请看下面我的回答。
M
Mathieu Hausherr

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

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


您现在可以对 AFURLConnectionOperation 及其子类执行 setAuthenticationChallengeBlock:,并传入逻辑以根据需要处理任何身份验证质询,而无需子类化。
T
Teo Choong Ping

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


C
Community

直到现在我无法弄清楚在执行 同步 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


你关于超时的观点很好,谢谢分享!我不明白这与同步发出请求有什么关系,你能扩展一下吗?
@JosephH 你是对的。当然有时候你在做异步请求的时候也需要设置一个超时时间。我已经更新了我的回答:]
Apple 修复了 timeoutInterval 不能小于 240 秒的问题,但这仍然是一个问题,因为即使您设置了 timeoutInterval,请求也不会以某种方式尊重它。
D
December

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


L
Lvsti

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


不要在答案中提问,你得到回应的机会非常非常低。改用评论或新问题;)
t
torhector2

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

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


是的,但在我看来,这不是使用 ASIHTTPRequest 进行开发的主要方法
那只是因为在编写 ASIHTTP 之后出现了块,我总是在 ASI 中使用块,而不是委托。