2012-04-17 3 views
2

Это еще один простой вопрос who'se ответ ускользает от меня после того, как час на Google ...NSURLConnection возвращает данные, но я не могу читать его

пользователь печатает что-то в текстовое поле и на этом поле теряет фокус, я запускаю NSURLConnection ....

NSString *usernameTry = [sender text]; 
NSLog(@"username field = %@",usernameTry); 

NSString *content = [@"http://www.siebenware.de/Rhythm/user/checkusername.php?username=" stringByAppendingString:usernameTry]; 
content = [content stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding]; 

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:content] cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:5.0]; 
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
[connection start]; 
NSLog(@"%@",content); 

Тогда я жду ответа ....

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
NSLog(@"Received Response"); 
if ([response isKindOfClass:[NSHTTPURLResponse class]]) { 
    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response; 
    int status = [httpResponse statusCode]; 

    if (!((status >= 200) && (status < 300))) { 
     NSLog(@"Connection failed with status %@", status); 
     [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
    } 
} 

} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
[resultsData appendData:data]; 
NSString *resultsString = [[NSString alloc] initWithData:resultsData encoding:NSUTF8StringEncoding]; 
NSLog(@"received data %@ %i",resultsString,[resultsString length]); 

if ([resultsString isEqualToString: @"FAIL"]){ 
    NSLog(@"failed to retrieve data"); 
}else{  
    resultsObjects = [[resultsString componentsSeparatedByString:@":"] mutableCopy]; 

    if([resultsObjects objectAtIndex:0][email protected]"usernamecheck"){ 
     if ([resultsObjects objectAtIndex:1]==username.text) { 
      if ([resultsObjects objectAtIndex:2][email protected]"NG"){ 
       //set the check marker to bad 
       [usernameVer setImage:[UIImage imageNamed:@"redcross.png"]]; 
      }else{ 
       //set the check market to good 
       [usernameVer setImage:[UIImage imageNamed:@"greentick.png"]]; 
      } 
     } 

    } 
} 
} 

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

NSLog([NSString stringWithFormat:@"Connection failed: %@", [error description]]); 
UIAlertView *errorAlert = [[UIAlertView alloc] initWithTitle:@"Unable to retrieve data" message:[NSString stringWithFormat:@"Error code %i",[error code]] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 

} 

Я вижу ответ прибыть в didReceiveResponse и я получаю 18 байт данных (которые я s правильно).

Однако didReceiveData говорит, что «данные» являются нулевыми. Я знаю, что я пропустил что-то исключительно простое, и я обещаю ударить себя, как только это будет выяснено.

С уважением Chris H

+0

где именно вы видите 18 байт данных? – giorashc

+0

Извините, удалил код. В didReceiveResponse я ранее смотрел, сколько я получил, но как только он работал, я удалил эту строку кода. –

+0

, когда вы говорите, что данные = null, вы имеете в виду аргумент данных или ваш член resultsData? – giorashc

ответ

5

, если вы хотите изменить данные в NSString вы можете сделать это:

NSString *responsestring = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; 
NSLog(@"%@", responsestring); 
+0

Спасибо за указатель. Я этого не понимаю, однако теперь это работает, если я не удаляю [responseData append: data] и не меняю initWithData: responseData на initWithData: data. –

+0

приятно слышать, как вы это поняли! – Manuel

+0

Извините, это означает, что если я удалю строку append: data и измените initwithData, чтобы получить прямой доступ к объекту 'data': –

0

Попробуйте с другими encoding..May быть кодировку ASCII вместо UTF-8. .Это может работать

+0

Спасибо, однако я заставлял UTF8 на сервере. –

1

Вам нужно работать с данными в:

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

Потому что

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data; 

можно назвать много раз

Вы можете сделать это:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    [myData appendData:data]; 
} 
- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    // TODO: work with data 
} 

NSMutableData * MyData должен быть экземпляр вар.

1

Вы должны преобразовать NSMutableData полученного метода делегата NSURLConnection в читаемый NSString, используя приведенный ниже код

 
NSString *finalString = [[NSString alloc]initWithData:responseData encoding:NSUTF8StringEncoding]; 

и что должно делать это.

Смежные вопросы