2010-03-15 11 views
11

Jestem nowy w rozwoju iPhone'a. Wysłałem URL z nazwą użytkownika i hasłem. Mogę wydrukować dane w metodzie "connection didReceiveData". Ale widzę metodę "connection didReceiveData" wywołaną dwa razy. Nie wiem, gdzie się mylę. Oto mój kodpołączenie didReceiveData wywołane dwukrotnie podczas wysyłania URL-a w iPhonie?

- (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); 
    } 

Cała strona HTML jest drukowany dwukrotnie w console.So proszę mi pomóc out.Thanks.

Odpowiedz

14

można otrzymać dane odpowiedzi w kawałkach, dlatego NSURLConnection's documentation stany:

Delegat powinien złączyć zawartość każdego obiektu danych dostarczanego do budowania kompletnych danych o obciążeniu URL

Użyj instancji NSMutableData do tego i przetwarzaj tylko pełne dane po otrzymaniu wiadomości -connectionDidFinishLoading:.

+0

Jeśli otrzymujesz duże ilości danych, możesz zajrzeć do NSFileHandler, aby zapisać kawałki na dysku w momencie ich przybycia. W przeciwnym razie NSMutableData powinno być w porządku, zwłaszcza, jeśli i tak nie chcesz przechowywać danych. – FelixLam

+0

Dobra uwaga, Felix - zwłaszcza jeśli chodzi o ograniczoną pamięć iPhone'a. –

11

Jako MacOS Developer Library stwierdza, połączenie: didReceiveData może być wywołana wiele razy, jeśli dane są odbierane w porcjach. Oznacza to, że musisz zapisać wszystkie porcje w niektórych zmiennych i przetwarzać dane w metodzie connectionDidFinishLoading. na przykład

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] 
} 
Powiązane problemy