開発中の大きなアプリのリクエストアーキテクチャへのアプローチを再考しているところです。私は現在ASIHTTPRequestを使用して実際にリクエストを作成していますが、さまざまなビューコントローラーでさまざまなアクションを実行した結果としてさまざまなタイプのリクエストが必要になるため、これらのリクエストを整理する最適なシステムを構築しようとしています。
私は現在、アプリデリゲートによって保持されるシングルトンの「リクエスター」を構築しており、リクエストの作成が必要であることを示すNSNotificationをリッスンしています。リクエストを作成し、レスポンスをリッスンし、レスポンスデータを含む新しいNSNotificationを送信します。これは私の問題のほとんどを解決しますが、失敗した要求または同じシングルトンリクエスタへの同時要求をエレガントに処理しません。
IOSアプリでさまざまな種類のリクエストを行うための明確なOOアーキテクチャを考案することで、誰もが成功していますか?
いくつかのアプローチを試した後、これは私に優れた結果をもたらし、文書化、理解、維持、および拡張が容易な1つのアーキテクチャです。
とにかく、これは私がしばらくそれをやってきた方法であり、率直に言ってそれはかなりうまくいきます。システムを水平方向に拡張し、必要に応じてASIHTTPRequestサブクラスを追加できます。ネットワークマネージャーのコアはそのまま残ります。
それが役に立てば幸い!
これが私が一般的に行う方法です。私も、ネットワークリクエストを行うために使用されるシングルトンオブジェクトを持っています。リクエストを頻繁に行う必要がある場合、通常はAFNetworkingを使用してリクエストを行うため、AFHTTPRequestOperations(またはAFJSONRequestOperations)を受け入れるNSOperationQueueがあります。これらについては、要求の成功または失敗時に実行されるcompletionBlockおよびfailureBlockプロパティがあります。私のシングルトンオブジェクトには、特定のネットワーク要求を開始するメソッドがあり、そのメソッドへのパラメーターとして、メソッドで定義されたブロックに渡すことができる成功および失敗のブロックを含めます。このようにして、アプリケーション全体がネットワーク要求を行うことができ、その時点でのアプリケーションのスコープは、メソッドに渡されるブロック内のシングルトンで使用できます。たとえば...(ARCを使用)
@implementation NetworkManager
-(void)makeRequestWithSuccess:(void(^)(void))successBlock failure:(void(^)(NSError *error))failureBlock
{
NSURL *url = [NSURL URLWithString:@"some URL"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
[responseObject doSomething];
if (successBlock)
dispatch_async(dispatch_get_main_queue(), successBlock);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
if (failureBlock)
dispatch_async(dispatch_get_main_queue(), ^{
failureBlock(error);
});
}];
[self.operationQueue addOperation:op];
}
@end
また、成功ブロックに、渡す必要のあるパラメーターを常に取得させることができます。
STNetTaskQueue を試してみてください。これにより、リクエストを再利用可能にして、保守可能にすることができます。
fully-loaded プロジェクトは良い読み物です。