1

プライベートサーバーでオンライン検索を行い、結果をユーザーに表示するアプリをプログラミングしています。テーブルビューを使用して結果を表示したいと思います。

私にできることは、データを送信し、応答を受信し、XMLを解析して、結果を配列に保存することです。

問題は次のとおりです。メソッドから、応答データを格納する配列にアクセスできません:- (void)connectionDidFinishLoading:(NSURLConnection *)connection

しかし、このメソッド内で同じ配列にアクセスすることはできます。私は初心者で混乱しました。インスタンス変数を作成し、メソッドのsearchResults配列で初期化しましたconnectionDidFinishLoadingが、Method:connectionDidFinishLoadingからこの配列にアクセスしようとすると、常にエラーが発生します。

Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 2 beyond bounds for empty array

このインスタンス変数がローカルで初期化されているだけなのはなぜか理解できません。

したがって、問題は、サーバーからメソッドから取得したデータにどのようにアクセスできるかということconnectionDidFinishLoadingです。

これが私のコードです:

-  (void)transmitXMLRequest:(NSData *)data{
    NSURL *webServiceURL = [NSURL URLWithString:@"some_url"];

    NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:webServiceURL];
    [urlRequest setHTTPMethod:@"POST"];
    [urlRequest setValue:@"text/xml" forHTTPHeaderField:@"Content-type"];
    [urlRequest setHTTPBody:data];

    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self];
    responseData = [[NSMutableData alloc] init];
    [connection start];


    if (!connection) {
        NSLog(@"Failed to submit request");
    } else {
        NSLog(@"Request submitted");
    }    
}

そしてデリゲートメソッド:

-     (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{    
    // responseData is an instance variable.
    [responseData setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    // responseData is an instance variable.   
    [responseData appendData:data];

}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{

    connection = nil;
    responseData = nil;

    NSLog(@"Connection failed! Error - %@ %@",
          [error localizedDescription],
          [[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]);
}

このメソッド内でのみデータにアクセスできます。

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{

    NSLog(@"Succeeded! Received %d bytes of data",[responseData length]);

    responseString = [[NSString alloc] initWithData:responseData encoding:NSASCIIStringEncoding];

    NSLog(@"Received file: \n%@", responseString);


    NSData *_data= [responseString dataUsingEncoding:NSUTF8StringEncoding];
    xmlParser = [[XMLParser alloc]loadXML:_data];    // _data is the response from server

    controller.searchResults = [[NSMutableArray alloc] init];
    controller.searchResults = [xmlParser jobs];
4

1 に答える 1

0

私の意見では、SOAP http://en.wikipedia.org/wiki/SOAPを使用する必要があります

SOAP は、もともと Simple Object Access Protocol として定義されていたもので、コンピューター ネットワークで Web サービスを実装する際に構造化された情報を交換するためのプロトコル仕様です。メッセージ形式は Extensible Markup Language (XML) に依存しており、メッセージのネゴシエーションと送信には通常、他のアプリケーション層プロトコル (最も顕著なのは Hypertext Transfer Protocol (HTTP) と Simple Mail Transfer Protocol (SMTP)) に依存しています。

于 2012-09-18T14:31:03.597 に答える