iOSアプリケーションでネットワークコールを行うためにASIHTTPRequestフレームワークを使用しています。しかし、私はアプリケーションのすべてのコントローラーで直接使用したくありません。だから私はASIHTTPRequestの周りにレイヤーを書くことを考えました。私のコードはASIHTTPRequestを使うためにこの層を使います。将来、このフレームワークを他のフレームワークに置き換えることができ、コードが変更されるだけで、レイヤーが変更されるはずです。私はそれをするための戦略が何であるべきかを知りたい。クラスをASIHTTPRequestクラスから継承するか、独自のクラスを実装する必要があります。私は実装を検討すべき方法は何でしょうか。ASIHTTPRequestのラッパー
現在、私はこれをこのように実装しています。 私のラッパーは
MyRequestHandler.h : NSObject
@property ASIHTTPRequest *asiHttpReq;
-(void) sendAsyncGetRequest
{
self.asiRequest = [ASIHTTPRequest requestWithURL:self.url];
if(self.tag != 0){
self.asiRequest.tag = self.tag;
}
[self.asiRequest setDelegate:self];
[self.asiRequest startAsynchronous];
}
- (void)requestFinished:(ASIHTTPRequest *)request{
MyResponseObj *respone = <From request obj>
if([delegate respondsToSelector:@selector(requestFinished:)]){
[delegate performSelector:@selector(requestFinished:) withObject:response];
}
}
であると私のViewControllerに私はこれを行うだろう:
MyViewController.h : UIViewContoller
@property MyRequestHandler *reqHandler;
-(void) fireRequest
{
NSString* requestUrl = <create URL>;
if(requestUrl){
// [self showLoadingIndicatorView];
// Proceed for request.
NSURL *url = [NSURL URLWithString:requestUrl];
reqHandler = [MyRequestHandler requestWithURL:url];
reqHandler.tag = 1000;
[reqHandler setDelegate:self];
[reqHandler sendAsyncGetRequest];
}
}
- (void)requestFinished:(MyResponse*) responseData{
// Do Your parsing n all here.
}
- (void)requestFailed:(MyResponse*) responseData{
// Handle the error here.
}
が、これはそれを行うための正しい方法です。ここでの問題は、私がviewcontrollerでmyrequesthandlerのプロパティを作成したときに、一度に1つのリクエストしか作成できず、同時に複数のリクエストを行うASIHTTPRequestの機能を失うことです。
このような問題にアプローチする方法を教えてください。
こんにちは、あなたが提供した解決策、多かれ少なかれ私が使っている解決策。私はちょうどここにそれのビットを与えた。ラッパーでは、getRequestは関数のローカル変数ではなくクラスのプロパティであるため、一度に1つのリクエストしか作成できません。最初のリクエストのレスポンスの前に2番目のリクエストを作成しようとすると、getRequestオブジェクトは2番目のリクエストに置き換えられ、最初のリクエストのレスポンスは返されません。 ASIHTTPRequestがNSOperationから派生し、各要求がNSOperationキューで実行される場合、複数の要求を同時に起動できます。 –
ASIHTTPRequestでは、NSOperationQueueに追加されるローカル変数を作成することで、このような複数のリクエストを発生させることができ、応答が返るまで生き続けることができます。 ASIHTTPRequest * req = [ASIHTTPRequest requestWithURL:url]; req.tag = MemberPrescriptionRequestTypeDrug; [req setDelegate:self]; [req startAsynchronous]; –
このラッパーは、1回の要求だけを実行することを目的としています。より多くを同時に実行する必要がある場合は、他の辞書やコールバックセレクタ(論理的なもの)を使用して 'RequestPerformer'の別のインスタンスを作成し、このインスタンスからリクエストを実行する必要があります。 – demon9733