2010-03-15 10 views
11

Tôi mới phát triển iphone. Tôi đã đăng URL bằng tên người dùng và mật khẩu. Tôi có thể in dữ liệu trong phương thức "connection didReceiveData". Nhưng tôi thấy phương thức "connection didReceiveData" được gọi hai lần. Tôi không biết, tôi đang đi sai ở đâu. Đây là mã của tôikết nối didReceiveData được gọi hai lần trong khi đăng một Url trong 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); 
    } 

Toàn bộ trang HTML được in hai lần trong bảng điều khiển. Xin hãy giúp tôi.

Trả lời

14

Bạn có thể nhận các dữ liệu phản ứng trong khối, đó là lý do NSURLConnection's documentation trạng thái:

"Các đại biểu nên nối các nội dung của từng đối tượng dữ liệu giao để xây dựng dữ liệu hoàn chỉnh cho một tải URL"

Sử dụng phiên bản NSMutableData để làm điều này và chỉ xử lý dữ liệu hoàn chỉnh khi bạn nhận được thông báo -connectionDidFinishLoading:.

+0

Nếu bạn nhận được lượng lớn dữ liệu, bạn có thể muốn xem NSFileHandler để ghi các phần vào đĩa khi chúng đến. Nếu không NSMutableData sẽ ổn, đặc biệt là nếu bạn không muốn lưu trữ dữ liệu. – FelixLam

+0

Điểm tốt, Felix - đặc biệt là về bộ nhớ hạn chế của iPhone. –

11

Vì trạng thái MacOS Developer Library, kết nối: didReceiveData có thể được gọi nhiều lần nếu dữ liệu được nhận theo khối. Điều đó có nghĩa là bạn phải lưu tất cả các khối trong một số biến và thực hiện xử lý dữ liệu trong phương thức connectionDidFinishLoading. ví dụ.

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] 
}