ASIHTTPRequest を使用していた私の古いアプリの更新に取り組んでいます。クライアントがこのアプリをアップグレードしたかったので、既存のプロジェクトをメモリ管理が処理される「 ARC 」プロジェクトに変換することにしました。アプリ自体によって。
ASIHTTPRequestは、複数のリクエストを実行するときにいくつかのエラーを発生させたため(および ASI が古くなっているという事実)、 AFNetworkingという新しいライブラリを採用することにしました。この現在のプロジェクト設定を AFNetworking に変換するときに、問題が発生しました。
現在のセットアップでは、次のように特定のサーバーへのリクエストを実行しました。
_request = [[ASIHTTPRequest alloc ] initWithURL:[NSURL URLWithString:url]];
[_request setShouldContinueWhenAppEntersBackground:NO];
[_request setDidFinishSelector:@selector(downloadPageHasFinished:)];
[_request setDidFailSelector:@selector(downloadPageHasFailed:)];
[_request setDelegate:self];
[_request startAsynchronous];
[ASIHTTPRequest setShouldUpdateNetworkActivityIndicator:YES];
上記の設定では、2 つのセレクター (didFinish と didFailed) を使用しており、(失敗した) 要求をキャッチできます。そのセレクター内で、responseData を指定された親に返します。
[parent downloadCompleted:YES andContent:responseData];
ここで、リクエストも実行し、指定された親に responseData を返したい AFNetworking に切り替えました。AFNetworking はブロックを使用するため、この responseData をいつ、どのように返すかはよくわかりません。Web サービスが XML を返すので、AFHTTPRequestOperation のサブクラスである KissXML ヘッダーリンクを追加することにしました。これで、ブロック ステートメント内で完全な XML ドキュメント (これが必要です) を取得するところまで来ました。しかし、このデータを特定のビューコントローラーに返す方法がわかりません(同時に複数のリクエストを実行できることもわかりません)。AFNetworking の現在のセットアップは次のとおりです。
-(NSData *)doAFNetworkRequest:(NSURL *)url {
__block NSData * datathingy = nil;
AFKissXMLRequestOperation *operation = [AFKissXMLRequestOperation XMLDocumentRequestOperationWithRequest:[NSURLRequest requestWithURL:url] success:^(NSURLRequest *request, NSHTTPURLResponse *response, DDXMLDocument *XMLDocument) {
NSLog(@"THE COMPLETE DOCUMENT: %@", XMLDocument);
datathingy = [[XMLDocument description] dataUsingEncoding:NSUTF8StringEncoding];
//the place where I can't return values
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, DDXMLDocument *XMLDocument) {
}];
[operation start];
return datathingy;
}
「return datathingy;」を配置すると、成功ブロック部分内でエラーが発生しています:
「'NSData *(^)(NSURLRequest *_ strong, NSHTTPURLResponse * _strong, DDXMLDocument *_ strong)' をタイプ 'void (^)(NSURLRequest * _strong, NSHTTPURLResponse *_ strong, DDXMLDocument * _strong ) のパラメーターに送信する互換性のないブロック ポインター タイプ)'"
では、要求されたビューコントローラーが正しい responseData を受け取り、nil 値を受け取ることがないように、ブロック内でその NSData オブジェクトを返すにはどうすればよいでしょうか?
注 1: 解析は特定のビュー コントローラーごとに処理されるため、完全な XML ドキュメントをビュー コントローラーに戻したいと考えています。したがって、responseData を親 Viewcontroller に渡すだけでそれを行う必要があります。
注 2: ASI を AF に直接変換する必要があるリソースを既に見つけましたが、AFNetworking のこれらの追加ヘッダーが、ASI で必要としていた以前のすべてのニーズ (ASIHTTPRequest のキャッシュおよび/または追加プロパティ) をサポートするかどうかはよくわかりません。