93

最近 ASIHTTPRequest の作業が停止したため、注目がAFNetworkingに移っているようです。

ただし、2 つのライブラリの機能の適切な比較がまだ見つかっていないため、切り替えた場合に何が失われるかはわかりません。

これまでに見つけた主な違いは次のとおりです。

  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

2 つのライブラリの適切な比較や、一方から他方への切り替えに関する文書化された経験を見た人はいますか?

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 ラッパー内に配置し、完了ブロックを記述することは、思ったほど難しくなく、何がサード パーティのライブラリをダンプしないのかを考え始めることに気付くでしょう。

ASI は、CFNetworking (C に基づく下位レベルの基盤フレームワーク) を使用してダウンロードとファイルのアップロードを可能にし、NSURLConnection を完全にスキップし、OS X および iOS 開発者のほとんどが恐れすぎて概念に触れないため、まったく異なるアプローチを使用します。このため、ファイルのアップロードとダウンロード、さらには Web ページのキャッシュが向上します。

どちらが好きですか?言うのが難しい。AFNetworking が十分に成熟すれば、ASI よりも好きになるでしょう。それまでは、ASI と、それが OS X と iOS で最もよく使われるフレームワークの 1 つになったことに感心せずにはいられませんでした。

編集: この投稿の後、状況が少し変わったので、この回答を更新する時が来たと思います。

この投稿は少し前に書かれたもので、AFNetworking は十分に成熟しています。1 ~ 2 か月前、AF は、フレームワークに関する私の最後の不満である POST 操作の小さな更新を投稿しました (エコーネスト アップロードが AF で失敗したが、ASI で正常に完了した理由は、小さな行末の障害でした)。認証は AFnetworking では問題になりません。複雑な認証方法の場合、操作をサブクラス化して独自の呼び出しを行うことができ、AFHTTPClient により基本認証が容易になります。AFHTTPClient をサブクラス化することで、サービス コンシューマ全体を短時間で作成できます。

AFNetworking が提供する絶対に必要な UIImage の追加は言うまでもありません。ブロックとカスタム完了ブロック、およびいくつかの巧妙なアルゴリズムを使用すると、非同期の画像のダウンロードとセルの塗りつぶしを備えたテーブル ビューを非常に簡単に作成できますが、ASI では、帯域幅を調整するために操作キューを作成し、次のように操作キューをキャンセルして再開する必要がありました。テーブルビューの可視性など。そのような操作の開発時間は半分になりました。

成功と失敗のブロックも大好きです。ASI には完了ブロック (実際には NSOperation の完了ブロック) しかありません。完了時にエラーが発生したかどうかを確認し、それに応じて対処する必要がありました。複雑な Web サービスの場合、すべての「if」と「else」で迷子になる可能性があります。AFNetworking では、物事ははるかに単純で直感的です。

ASI は当時としては優れていましたが、AF を使用すると、Web サービスの処理方法を完全に変更して、スケーラブルなアプリケーションをより簡単に作成できます。iOS 3 以下をターゲットにしたい場合を除き、ASI に固執する理由はもうないと確信しています。

于 2011-12-04T17:21:14.033 に答える
17

ASI の代わりに AFNetworking を使用しているプロジェクトを仕上げています。以前のプロジェクトで ASI を使用したことがあります。以前は大変お世話になりました。

AFNetworking に欠けている (今日の時点で) 知っておくべきことは次のとおりです。

  • 何もない

ASIはなくなります。今すぐAFを使用してください。小さくて機能し、引き続きサポートされます。また、特に 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 にジャンプすることに興奮していますが、AfNetworking のファイルアップロードのサポートは、ASI* に比べて使いやすいものではありません。

于 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 では、個々の要求に userinfo ディクショナリを添付できることが気に入りました。私が見る限り、これに対する直接的なサポートはありませんAFHTTPRequestOperation。エレガントな回避策を思いついた人はいますか? もちろん、些細なサブクラス化は別として。

于 2012-11-30T11:11:59.317 に答える
-8

AFNetworking は、ASIHTTPRequest のようにデリゲートを操作するよりも自然な「ブロック」で機能します。

ブロックの操作は、JavaScript で匿名関数を操作するようなものです。

于 2011-09-27T15:18:35.080 に答える