次のメソッドは、AFNetworking を使用してリクエストを Web サービスに送信し、(成功すると) レスポンスに基づいて動作します。AFNetworking はリクエストを非同期的に行い、ブロックを使用して成功または失敗を判定します。したがって、リクエストを送信するメソッドは次のようになります (簡略化)。
- (void)sendRequestForConnector:(NSString *)connector
success:(void (^)(NSData *responseXml))success
failure:(void (^)(NSError *error))failure
{
AFHTTPRequestOperation *operation = [self HTTPRequestOperationForConnector:connector];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject)
{
[self handleSuccessForConnector:connector response:[operation responseData]];
success([operation responseData]);
}
failure:^(AFHTTPRequestOperation *operation, NSError *error)
{
[self handleFailureForConnector:connector error:error];
failure(error);
}
[operation start];
}
別のクラスでは、このメソッドを使用して Web サービスを複数回呼び出します。前の呼び出しが成功すると、次の呼び出しが行われます。このメソッドは次のようになります (簡潔にするために失敗ブロックは省略されています)。
- (void)import
{
[client sendRequestForConnector:@"cities" success:^{
[client sendRequestForConnector:@"categories" success:^{
[client sendRequestForConnector:@"categoryTranslations" success:^{
[client sendRequestForConnector:@"products" success:^{
[client sendRequestForConnector:@"productTranslations" success:^{
[self finishImport];
}];
}];
}];
}];
}];
}
これは機能しますが、ご覧のとおり、各 Web サービス呼び出しは別のネストされた成功ブロック ハンドラーを追加します。これを行うにはもっと良い方法があるに違いないと私には思えますが、思いつきません。
できれば、次の呼び出しを行う前に前の呼び出しが完了するのを待ち、GCD のようなものを使用して import メソッド全体を非同期的に呼び出したいと考えています。ただし、AFNetworking は同期呼び出しを行うようには設計されていません。
これを達成する方法についてのアイデアは大歓迎です。または、私の現在のソリューションは進むべき道ですか?