-1

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 のキャッシュおよび/または追加プロパティ) をサポートするかどうかはよくわかりません。

4

1 に答える 1

1

doAFNetworkRequest メソッドが viewcontroller クラスにある場合は、次のように簡単に実行できます。

-(void)doAFNetworkRequest:(NSURL *)url {
    __block NSData * datathingy = nil;
    __unsafe__unretained selfPointer = self;
    AFKissXMLRequestOperation *operation = [AFKissXMLRequestOperation XMLDocumentRequestOperationWithRequest:[NSURLRequest requestWithURL:url] success:^(NSURLRequest *request, NSHTTPURLResponse *response, DDXMLDocument *XMLDocument) {
        NSLog(@"THE COMPLETE DOCUMENT: %@", XMLDocument);
        datathingy = [[XMLDocument description] dataUsingEncoding:NSUTF8StringEncoding];

        [selfPointer parseXML:datathingy];

    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, DDXMLDocument *XMLDocument) {


    }];

    [operation start];

}

しかし、このリクエストコードをviewcontrollerに入れるのは良くありません。より良い方法は、すべてのネットワーク リクエストを処理するシングルトン クラスを作成することです。その場合、そのネットワーク ハンドラ クラスでプロトコルを作成します。

@protocol NetworkHandlerProtocol
-(void)requestSuccessWithData:(NSData *)data;
-(void)requestFailedWithError:(NSError *error);

およびデリゲート:

id<NetworkHandlerProtocol> delegate;

-(void)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
        [self.delegate requestSuccessWithData:datathingy];
    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, DDXMLDocument *XMLDocument) {


    }];
    [operation start];

次に、ビューコントローラーで、リクエストを行うときに:

NetworkHandler *handler = [NetworkHandler sharedHander];
handler.delegate = self;
[handler doAfNetworkRequest:url];

//some where implement the protocol methods
-(void)requestSuccessWithData:(NSData *)data
{
    //you can do something with the return data here
}
于 2013-02-19T22:47:13.690 に答える