【问题标题】:Discussion on 'didReceiveData' method for HTTP Connection讨论 HTTP 连接的 'didReceiveData' 方法
【发布时间】:2009-03-16 09:14:06
【问题描述】:

我为 HTTP 连接创建了一个独立的类。所有连接工作正常。问题是我发现方法'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 的文本?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    听起来差不多。在收到之前,您无法使用收到的东西。

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

    在connection:didReceiveData: 方法中创建主视图控制器和应用程序委托似乎真的迟到了。早点做这些事情,然后让connection:didReceiveData: 什么都不做,只设置labelStr.text。

    顺便说一句,您显示的connection:didReceiveData: 的实现泄漏ReturnStr。请记住释放或自动释放您已分配的内容。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 加载完成后如何关闭连接?有没有类似 didFinishLoading 的方法。
      • 使用 sendSynchronousRequest:returningResponse:error:,这一切都由该方法管理。当方法返回时,连接已经打开,请求发送,响应接收,连接再次关闭。不过,所有这些都可能需要几秒钟。
      【解决方案3】:

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

      initWithRequest:delegate: 立即返回,在将委托方法发送给它的委托之前,您不会对连接内容感到恼火。

      【讨论】:

        【解决方案4】:

        使用 NSMutableData 代替 NSData。

        【讨论】:

        • 嗨 new-soul,receivedData 已经被声明为 NSMutableData。
        猜你喜欢
        • 2012-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-09
        • 1970-01-01
        • 1970-01-01
        • 2021-08-10
        • 2012-01-07
        相关资源
        最近更新 更多