2010-03-15 7 views
11

Sono nuovo nello sviluppo di iphone. Ho pubblicato l'URL con il nome utente e la password. Sono in grado di stampare i dati nel metodo "connection didReceiveData". Ma vedo il metodo "connection didReceiveData" chiamato due volte. Non so, dove sto andando male. Ecco il mio codicedideceeceData ha chiamato due volte durante la pubblicazione di un Url in iphone?

- (void)viewDidLoad { 
[super viewDidLoad]; 

NSString *post = [NSString stringWithFormat:@"&domain=school.edu&userType=2&referrer=http://apps.school.edu/navigator/index.jsp&username=%@&password=%@",@"xxxxxxx",@"xxxxxx"]; 

NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 

NSString *postLength = [NSString stringWithFormat:@"%d",[postData length]]; 

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; 

[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://secure.school.edu/login/process.do"]]]; 

[request setHTTPMethod:@"POST"]; 

[request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 

[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Current-Type"]; 

[request setHTTPBody:postData]; 

NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:request delegate:self]; 

if(conn) 
{ 
    NSLog(@"Connection Successful"); 

} 
else 
{ 
    NSLog(@"Connection could not be made"); 
} 

    } 

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

NSString *string = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; 
NSLog(@"the data %@",string); 
    } 

La pagina HTML intera viene stampato due volte nel console.So please help me out.Thanks.

risposta

14

È possibile ricevere le dati di risposta in blocchi, che è il motivo per cui gli stati NSURLConnection's documentation:

"Il delegato deve concatenare il contenuto di ogni oggetto di dati consegnati a costruire i dati completi per un carico URL"

Utilizzare un'istanza di NSMutableData per questo e elaborare i dati completi solo dopo aver ricevuto il messaggio -connectionDidFinishLoading:.

+0

Se si ricevono grandi quantità di dati, si consiglia di guardare NSFileHandler per scrivere i blocchi sul disco man mano che arrivano. Altrimenti NSMutableData dovrebbe andare bene, soprattutto se non si desidera memorizzare comunque i dati. – FelixLam

+0

Buon punto, Felix - specialmente per quanto riguarda la memoria limitata dell'iPhone. –

11

Come stato MacOS Developer Library, connessione: didReceDataData può essere richiamato più volte se i dati vengono ricevuti in blocchi. Ciò significa che devi salvare tutti i blocchi in una variabile e eseguire l'elaborazione dei dati nel metodo connectionDidFinishLoading. per esempio.

NSMutableData *receivedData = [[NSMutableData alloc] init]; 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    // Append the new data to receivedData. 
    [receivedData appendData:data]; 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    // do something with the data, for example log: 
    NSLog(@"data: %@", [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding] 
} 
Problemi correlati