Соединение didReceiveData дважды вызывалось при отправке Url в iphone?
Я новичок в разработке iphone. Я разместил URL-адрес с именем пользователя и паролем. Я могу распечатать данные в методе "connection didReceiveData". Но я вижу метод "connection didReceiveData", который вызывается дважды. Я не знаю, где я ошибаюсь. Вот мой код
- (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);
}
Вся HTML-страница печатается дважды в консоли. Поэтому, пожалуйста, помогите мне. Спасибо.
Ответы
Ответ 1
Вы можете получить данные ответа в кусках, поэтому Документация NSURLConnection гласит:
"Делегат должен конкатенировать содержимое каждого переданного объекта данных, чтобы собрать полные данные для загрузки URL."
Используйте экземпляр NSMutableData
для этого и обрабатывайте полные данные только после получения сообщения -connectionDidFinishLoading:
.
Ответ 2
Как MacOS Developer Library заявляет, что соединение: didReceiveData можно вызывать несколько раз, если данные получены в кусках. Это означает, что вам нужно сохранить все куски в некоторой переменной и выполнить обработку данных в методе connectionDidFinishLoading. например.
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]
}