web-dev-qa-db-ja.com

AFNetworkingに欠けている主なASIHTTPRequest機能は何ですか?

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つのライブラリの良い比較や、一方から他方への切り替えの文書化された経験を見たことがありますか?

93
JosephH

私はASIHTTPRequestが大好きで、それがうまくいくのを見て悲しかったです。ただし、ASIの開発者は正しかったので、ASIHTTPRequestは非常に大きくなり肥大化したため、iOSやその他のフレームワークの最新機能と同等の時間を割くことができませんでした。私は先に進み、現在AFNetworkingを使用しています。

そうは言っても、AFNetworkingはASIHTTPよりもはるかに不安定であり、私が使用するためには改良が必要だと言わなければなりません。

画面に結果を表示する前に、多くの場合、100個のHTTPソースに対してHTTP要求を行う必要があり、AFHTTPNetworkOperationを操作キューに入れました。すべての結果をダウンロードする前に、操作キュー内のすべての操作をキャンセルし、結果を保持しているView Controllerを終了できるようにしたいと思います。

それは常に機能するとは限りません。

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操作の小さな更新を投稿しました(小さな行の終了エラーは、echonestのアップロードがAFで失敗したが、 ASI)。認証はAFnetworkingでは問題ではありません。複雑な認証方法については、操作をサブクラス化して独自の呼び出しを行うことができ、AFHTTPClientは基本認証を簡単にします.AFHTTPClientをサブクラス化することにより、サービス全体を短時間で消費者にすることができます.

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

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

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

59
csotiriou

ASIの代わりにAFNetworkingを使用しているプロジェクトを仕上げるだけです。以前のプロジェクトでASIを使用したことがあります。過去に大きな助けになりました。

AFNetworkingに欠けているもの(今日)は、次のとおりです。

  • なし

ASI 遠ざかる 。今すぐAFを使用します。小さく、機能し、引き続きサポートされます。また、特にAPIクライアント向けに、より論理的に整理されています。テーブルビューでの画像の非同期読み込みなど、頻繁に使用される特殊なケースのための優れたクラスが多数あります。

17
Jeff

AFNetworkingは、TLSクライアント認証のclientCertificateIdentityおよびclientCertificatesをサポートしていません。

AFURLConnectionOperationのサブクラスで- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challengeメソッドを使用してこれを行うことができますが、それは簡単ではありません。

4

今まで synchronous POST requestを実行するときに、AFNetworkingでtimeoutを設定する方法がわかりませんでした。UPDATE:ついにわかりました: 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でタイムアウトを設定する方法

2
borisdiakur

私はしばらくASI *を使用しており、ASIのfileuploadアプローチが大好きです。AFNetworkingにジャンプすることに興奮していますが、AfNetworkingのfileuploadサポートはASI *に比べて使いやすいものではありません。

2
Teo Choong Ping

AFNetworkには、大きなファイルをアップロードする機能がありません。ファイルの内容がRAMにあると想定しています。 ASIは、ディスクからファイルコンテンツを単純にストリーミングできるほどスマートでした。

2
rosstulloch

ASIHTTPでは、個々のリクエストにユーザー情報辞書を添付できることが大好きでした。私が見る限り、AFHTTPRequestOperationでこれを直接サポートすることはありません。誰かがまだエレガントな回避策を考え出しましたか?もちろんささいなサブクラス化は別として。

0
Lvsti