「ベースプロキシ」から継承する「プロキシ」クラスがいくつかあります。これらのクラスはサーバーに接続し、デリゲートにデータを渡します。ステータス コードが 0 の場合は、これらの異なるリクエストを同じ方法で処理したいと考えています。
ステータス コードが 0 の場合、ユーザーのインターネット接続が改善されることを期待して、5 秒後にメソッドを再試行します。
何かProxy.m
- (void)fetchSomething {
NSString *fullPath = [NSString stringWithFormat:@"%@/route/index.json",MY_BASE_URL];
NSURL *url = [NSURL URLWithString:fullPath];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFJSONRequestOperation *operation = [[AFJSONRequestOperation alloc] initWithRequest:request];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
NSDictionary *d = (NSDictionary *)responseObject;
[self.delegate fetchedPolicy:d[@"keypath"]];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
[self handleOperationFailed:operation action:^{
[self fetchSomething];
}];
}];
NSOperationQueue *q = [[NSOperationQueue alloc] init]; [q addOperation:operation];
}
MyBaseProxy.m
- (bool)shouldRetryOperation:(AFHTTPRequestOperation *)o {
return self.retries < [self maxRetries];
}
- (void)handleOperationFailed:(AFHTTPRequestOperation *)o action:(ActionBlock)block {
NSInteger statusCode = o.response.statusCode;
if (statusCode == 0) {
if ([self shouldRetryOperation:o]) {
double delayInSeconds = 5.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
self.retries++;
block();
});
} else {
self.retries = 0;
[SVProgressHUD showErrorWithStatus:@"Please check your internet connection and try again"];
return;
}
}
self.retries = 0;
リクエストの失敗を処理するより良い方法は何ですか? AFHTTPRequestOperation をサブクラス化する必要がありますか?
編集: 紛らわしいテキストを削除しました。私が「同じ方法」を意味したとき、私は要求ごとを意味しました。すべての 500 を同じように処理し、すべての 403 を同じように処理します。具体的には、ステータス コード 0 の処理をお願いしています - インターネット接続がありません。