соединение дважды вызывается при отправке URL-адреса в iphone? - PullRequest
11 голосов
/ 15 марта 2010

Я новичок в разработке для 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 печатается дважды в консоли. Так что, пожалуйста, помогите мне. Спасибо.

Ответы [ 2 ]

14 голосов
/ 15 марта 2010

Вы можете получить данные ответа кусками, поэтому Документация NSURLConnection гласит:

" Делегат должен объединить содержимое каждого доставленного объекта данных для создания полных данных для загрузки URL ."

Используйте для этого экземпляр NSMutableData и обработайте полные данные только после получения сообщения -connectionDidFinishLoading:.

11 голосов
/ 06 июня 2012

Как указывает MacOS Developer Library , connection: 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]
}
...