2010-03-15 5 views
11

Ich bin neu in der iPhone-Entwicklung. Ich habe die URL mit dem Benutzernamen und dem Passwort gepostet. Ich bin in der Lage, die Daten in "Verbindung didReceiveData" -Methode zu drucken.Aber ich sehe "Verbindung didReceiveData" -Methode zweimal aufgerufen. Ich weiß nicht, wo ich falsch liege. Hier ist mein CodeVerbindung DidReceiveData zweimal beim Buchen einer Url in iPhone aufgerufen?

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

Die gesamte HTML-Seite wird zweimal im console.So gedruckt bitte helfen Sie mir out.Thanks.

Antwort

14

Sie können die Antwortdaten in Blöcken erhalten, weshalb NSURLConnection's documentation heißt es:

Die Delegierten sollten den Inhalt jedes Datenobjekt verketten geliefert die vollständigen Daten für eine URL Last aufbauen“

Verwenden Sie dazu eine Instanz von NSMutableData und verarbeiten Sie erst die vollständigen Daten, wenn Sie die Nachricht -connectionDidFinishLoading: empfangen haben.

+0

Wenn Sie große Datenmengen empfangen, sollten Sie sich NSFileHandler ansehen, um die Chunks auf die Festplatte zu schreiben, sobald sie eintreffen. Sonst sollte NSMutableData in Ordnung sein, besonders wenn Sie die Daten sowieso nicht speichern wollen. – FelixLam

+0

Guter Punkt, Felix - besonders in Bezug auf den begrenzten Speicher des iPhones. –

11

Wie MacOS Developer Library Staaten, Verbindung: didReceiveData kann mehrmals aufgerufen werden, wenn Daten in Chunks empfangen werden. Das bedeutet, dass Sie alle Chunks in einer Variablen speichern und Daten in der Methode connectionDidFinishLoading verarbeiten müssen. z.B.