连接didReceiveData在iphone中发布Url时调用了两次?

时间:2010-03-15 09:32:32

标签: iphone url posting

我是iphone开发的新手。我发布了带有用户名和密码的URL。我能够在“连接didReceiveData”方法中打印数据。但是我看到“连接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 个答案:

答案 0 :(得分:14)

您可能会收到块中的响应数据,这就是NSURLConnection's documentation声明的原因:

委托应该连接每个数据对象的内容,以构建URL加载的完整数据。”

为此使用NSMutableData的实例,仅在收到-connectionDidFinishLoading:消息后处理完整数据。

答案 1 :(得分:11)

MacOS Developer Library所述,如果以块的形式接收数据,则可以多次调用connection:didReceiveData。这意味着您必须将所有块保存在某个变量中,并在connectionDidFinishLoading方法中进行数据处理。 e.g。

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