プライベートサーバーでオンライン検索を行い、結果をユーザーに表示するアプリをプログラミングしています。テーブルビューを使用して結果を表示したいと思います。
私にできることは、データを送信し、応答を受信し、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];