最新の AFNetworking V2.0 を使用しています。到達可能性が利用可能な場合、一連の操作を AFHTTPRequestOperationManager の操作キューで実行するように設定しました。appDelegate でグローバル AFHTTPRequestOperationManager をセットアップし、それを使用して到達可能性を確認し、到達可能性が利用できない場合は、操作の実行を避けるために AFHTTPRequestOperationManager の操作キューを一時停止します。到達可能性が戻ったら、isSuspended を false にして操作を再開します。
私が今抱えている問題は、到達可能性が利用できないときに isSuspended を YES に設定したとしても、操作キューが引き続き起動し、操作の失敗ブロックに移動することです。
これが私のセットアップです。
AppDelegate.m
self.reachManager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[NSURL URLWithString:API_SERVER_URL]];
self.reachManager.responseSerializer = [AFJSONResponseSerializer serializer];
__block NSOperationQueue *operationQueue = self.reachManager.operationQueue;
[operationQueue setMaxConcurrentOperationCount:1];
__block AppDelegate * weakSelf = self;
[self.reachManager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
switch (status) {
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"not reachable");
[operationQueue setSuspended:YES];
[weakSelf showReachabilityAlert:YES];
break;
case AFNetworkReachabilityStatusReachableViaWiFi:
[weakSelf showReachabilityAlert:NO];
[operationQueue setSuspended:NO];
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
[weakSelf showReachabilityAlert:NO];
[operationQueue setSuspended:NO];
break;
default:
[weakSelf showReachabilityAlert:NO];
[operationQueue setSuspended:YES];
break;
}
}];
[self.reachManager.reachabilityManager startMonitoring];
ビューコントローラー
AppDelegate *ad = [[UIApplication sharedApplication] delegate];
NSMutableArray *mutableOperations = [NSMutableArray array];
NSArray * data = [NSArray arrayWithObjects:@"media", @"analysis", nil];
for(NSString * c in data)
{
NSURL *URL = [NSURL URLWithString:[NSString stringWithFormat:API_SERVER_SECTION_URL, c]];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
op.responseSerializer = [AFJSONResponseSerializer serializer];
[op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"JSON: received for tag %@", c);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error message : %@", error);
}];
[mutableOperations addObject:op];
}
NSArray *operations = [AFURLConnectionOperation batchOfRequestOperations:mutableOperations progressBlock:^(NSUInteger numberOfFinishedOperations, NSUInteger totalNumberOfOperations) {
NSLog(@"%d of %d complete", numberOfFinishedOperations, totalNumberOfOperations);
} completionBlock:^(NSArray *operations) {
NSLog(@"All operations in batch complete");
}];
//Check the reachability and suspend the opearation queue if there is no reachability
if([ad.reachManager.reachabilityManager isReachable])
[ad.reachManager.operationQueue setSuspended:NO];
else
[ad.reachManager.operationQueue setSuspended:YES];
[ad.reachManager.operationQueue addOperations:operations waitUntilFinished:YES];
インターネットが存在しない場合、操作キューを一時停止するにはどうすればよいですか? インターネットが戻ったらキューを再開しますか?
ありがとう、アンソニー