关于HTTP连接的'didReceiveData'方法的讨论

时间:2009-03-16 09:14:07

标签: iphone objective-c cocoa-touch http class-design

我为HTTP连接创建了一个indenpendent类。所有的连接工作正常。问题是我发现方法'didReceiveData'将在调用连接的方法之后被调用。 (方法'didReceiveData'将在IBAction'accept'之后调用)


- (IBAction)accept:(id)sender {
    [self connect:url];
    //labelStr = ReturnStr; Cannot be written here. 
}

-(void)connect:(NSString *)strURL
{
    NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:strURL]
                                              cachePolicy:NSURLRequestUseProtocolCachePolicy
                                          timeoutInterval:60.0];

    NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
    if (theConnection) 
    {
        // receivedData is declared as a method instance elsewhere
        receivedData = [[NSMutableData data] retain];
    } 
    else 
    { 
        // inform the user that the download could not be made
    }
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    // append the new data to the receivedData
    [receivedData appendData:data];
    ReturnStr = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
}

这会导致一个问题,即如果我想将标签的文本更改为接收的字符串,则代码不能用IBAction'accept'编写,但必须用方法'didReceiveData'编写,如下所示:


    MainViewController *mainView = [[MainViewController alloc] initWithNibName:@"MainView" bundle:nil];
    AMEAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
    [delegate.navController pushViewController:mainView animated:YES];
    mainView.labelStr.text = ReturnStr;

另一个问题是,如果我在'didReceiveData'中初始化MainView,将覆盖MainView上的数据。我是否可以在不初始化MainView的情况下更改labelStr的文本?

4 个答案:

答案 0 :(得分:2)

  

问题是我发现方法'didReceiveData'将在调用连接的方法之后被调用。 (方法'didReceiveData'将在IBAction'accept'之后调用)

您希望连接在创建和连接之前向您发送connection:didReceiveData:吗?

  

这会导致一个问题,如果我想将标签的文本更改为接收的字符串,则代码不能用IBAction'accept'编写,但必须用方法'didReceiveData'编写......

听起来很对。在收到之前,你不能使用你收到的东西。

  

另一个问题是,如果我在'didReceiveData'中初始化MainView,将覆盖MainView上的数据。我是否可以在不初始化MainView的情况下更改labelStr的文本?

在您的connection:didReceiveData:方法中创建主视图控制器和应用委托似乎真的迟到了。事先做好这些事情,然后connection:didReceiveData:除了设置labelStr.text之外什么都不做。

BTW,connection:didReceiveData:的实施显示泄漏ReturnStr。记得释放或自动释放你所拥有的东西。

答案 1 :(得分:1)

如果您希望应用等待数据进入,请使用NSURLConnection的sendSynchronousRequest:returningResponse:error:方法。但请注意,在运行此方法时,应用程序的其余部分将被冻结,当然,如果用户连接不清,则该方法可能需要一段时间。

答案 2 :(得分:0)

NSURLConnection和其他类似的类被设计为异步使用。

initWithRequest:delegate:立即返回,并且您不会对连接内容感到烦恼,直到它将委托方法发送给其委托。

答案 3 :(得分:0)

使用NSMutableData而不是NSData。