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


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つのライブラリの優れた比較、または1つのライブラリから別のライブラリへの切り替えの記録された経験を見た人はいますか?


AFNetworkingには、非常に詳細なドキュメントと例が不足しているため、あまり説明できません。私がASIHTTPRequestを使用する主な理由は、iOS 3.0をサポートし、ASIFallbackToCacheIfLoadFailsCachePolicy非常に優れているためです。また、AFNetworkingは永続的なキャッシュをサポートしていないと思います。これは私にとっては立ち入り禁止です。
iwat 2009

あなたが質問にタグを付ける最初の人であることに注意してくださいafnetworking
iwat 2009

AFNetworkingにプルされるのを待っているキャッシュがあります。質問にリンクを追加しました。
JosephH 2011

1
@iwat AFNetworkingはを完全にサポートしていますNSURLCache。ディスクキャッシュを探している場合は、Peter SteinbergerのSDURLCache forkを強くお勧めします
mattt '25年

2
私のネットワークフレームワークMKNetworkKitを試しましたか?blog.mugunthkumar.com/products/…基本認証、ダイジェスト認証、NTLM認証、自動キャッシュ、組み込みの画像キャッシュ、非常に簡単なファイルアップロードのサポート、優れたドキュメントなどがプラスです。
Mugunth 2011

回答:


59

私はASIHTTPRequestを愛し、それがうまくいくのを見て悲しかった。しかし、ASIの開発者は正しかった。ASIHTTPRequestは非常に大きく膨れ上がっているため、iOSや他のフレームワークの最新機能に対応するために時間を割くことができなかった。私は次に進み、AFNetworkingを使用します。

とは言っても、AFNetworkingはASIHTTPよりもはるかに不安定であり、私がそれを使用するためには、改良が必要です。

結果を画面に表示する前に、100個のHTTPソースにHTTPリクエストを送信する必要があることが多く、AFHTTPNetworkOperationを操作キューに入れました。すべての結果がダウンロードされる前に、操作キュー内のすべての操作をキャンセルして、結果を保持しているビューコントローラーを閉じることができるようにしたいと思います。

それは常にうまくいくとは限りません。

AFNetworkingではランダムにクラッシュしますが、ASIHTTPRequestではこの操作は問題なく機能していました。AFNetworkingのどの特定の部分がクラッシュしているのかがわかります。異なるポイントでクラッシュし続けます(ただし、これらのほとんどの場合、デバッガはNSURLConnectionオブジェクトを作成するNSRunLoopをポイントします)。そのため、AFNetworkingは、ASIHTTPRequestと同様に完全であると見なされるために成熟する必要があります。

また、ASIHTTPRequestsはクライアント認証をサポートしていますが、現時点ではAFNetworkingにはありません。これを実装する唯一の方法は、AFHTTPRequestOperationをサブクラス化し、NSURLConnectionの認証メソッドをオーバーライドすることです。ただし、NSURLConnectionに関与し始めると、NSOperationConnectionラッパー内にNSURLConnectionを配置して完了ブロックを書き込むのはそれほど難しいことではないことに気づき、サードパーティのライブラリをダンプしない理由を考え始めます。

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

どちらを選びますか?言うのが難しい。AFNetworkingが十分に成熟すれば、ASIよりも気に入ってくれるでしょう。それまでは、ASIと、それがOS XとiOSで常に最もよく使用されるフレームワークの1つになったことを賞賛せざるを得ません。

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

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

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

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

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


1
+1は非常に慎重です。おそらく、あなたのクラッシュをstackoverflowの質問として投稿する価値はありますか?もっと詳しく見てみたいです。
JosephH

ありがとう。クラッシュに関する具体的なデータがあれば、それを行います。
csotiriou

3
安定性の問題はまだ問題ですか?
Johan Karlsson

1
数日前に実行したテストに基づく予備データについては、違います。そうではありません。ただし、フレームワークの最新バージョンでも、特定の条件下で一連のアクション(十分な割り当て/すぐにキャンセル/割り当て解除/再割り当て/開始)で十分なストレスがかかると、AFURLConnectionの実行ループでクラッシュする例があります。ただし、NSOperation完了ブロックおよびNSRunLoopと関係がある必要があります。AFNetworkingの実装を確認しましたが、原因が見つかりませんでした。
csotiriou 2012年

ASIには障害ブロックがあります。
Kekoa

17

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

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

  • 何もない

ASI は廃止されます。今すぐAFを使用してください。それは小さく、機能し、引き続きサポートされます。また、特にAPIクライアントの場合は、より論理的に整理されています。これには、テーブルビューでの画像の非同期読み込みなど、よく使用される特別な場合のための多くの優れたクラスがあります。


9
@iwatが質問の内容で述べたように、AFNetworkingには堅牢なキャッシュがありません。これは興味深い質問であり、「何もない」というのは間違った答えです。それ以外は、私はあなたの感情に完全に同意します。
ケニーウィンカー2011

1
@KennyWinkerそのコメントスレッドで私の返信を見てください。AFNetworkingは意図的にキャッシュを構築しないと言って嬉しいです。むしろ、お気に入りのNSURLCacheベースのソリューションを自由に入れ替えることができます。
mattt '25年

1
何もない-リクエストでプロキシをどのように使用できますか?
Alex Volovoy

@AlexVolovoyあなたはおそらくそれを新しい質問として尋ねるのが最善でしょう
JosephH

「何も」とは言わない。以下の私の答えを見てください。
borisdiakur 2012年

4

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

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


5
これsetAuthenticationChallengeBlock:AFURLConnectionOperation、そのサブクラスを実行し、ロジックを渡して、サブクラスを作成しなくても、必要に応じて認証の課題を処理できます。
mattt

2

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


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でタイムアウトを設定する方法


タイムアウトについてのあなたのポイントは良いです、共有してくれてありがとう!これが同期的にリクエストを作成することとどのように関連するのか理解できません。
JosephH 2012年

@JosephHあなたは正しいです。もちろん、非同期リクエストを行うときにタイムアウトを設定する必要がある場合もあります。
回答

Appleは、timeoutIntervalが240秒未満にできない問題を修正しましたが、timeoutIntervalを設定しても、リクエストが何らかの方法でそれを尊重しないため、これは依然として問題です。
Jasper

2

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


0

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


2
回答に質問をしないでください。応答が得られる可能性は非常に低くなります。代わりにコメントまたは新しい質問のいずれかを使用してください;)
ミハル

-8

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

ブロックの操作は、JavaScriptの無名関数の操作に似ています。


確かに、しかし私の意見では、それはASIHTTPRequestで開発する主なアプローチではありません
torhector2 '28

7
これは、ASIHTTPが作成された後にブロックが導入されたためです。委任ではなく、常にASIでブロックを使用します。
hypercrypt '28
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.