本文介绍了等待NSURLConnection的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有发送HTTP POST连接的代码。我希望该方法等到收到服务器的响应后才能继续运行。我这样做的原因是因为我正在将新代码(异步POST与旧的同步POST)集成到我们的应用程序中,并且我希望在整个应用程序中进行最小程度的更改。

旧方法如下:

-(NSData*) postData: (NSString*) strData;

应用程序将调用它并向其发送strData对象,并且它将锁定主线程,直到它得到一些东西。这很低效,但工作得很好,但由于超时限制,我必须更改它。

所以我的新方法(在这里发布完整的方法)如下:

-(NSData*) postData: (NSString*) strData
{
    //start http request code
    //postString is the STRING TO BE POSTED
    NSString *postString;
    //this is the string to send
    postString = @"data=";
    postString = [postString stringByAppendingString:strData]; 
    NSURL *url = [NSURL URLWithString:@"MYSERVERURL"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    NSString *msgLength = [NSString stringWithFormat:@"%d", [postString length]];
    //setting prarameters of the POST connection
    [request setHTTPMethod:@"POST"];
    [request addValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    [request addValue:msgLength forHTTPHeaderField:@"Content-Length"];
    [request addValue:@"en-US" forHTTPHeaderField:@"Content-Language"];
    [request setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]];
    [request setTimeoutInterval:20]; //one second for testing purposes
    NSLog(@"%@",postString);    
    NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
    [connection start];
    //end http request code
    return receivedData; //this is set by a delegate somewhere else in the code
}

它发送代码很好,但当然(正如预期的那样),它接收代码的速度不够快,无法正确返回。

您建议我可以做些什么来"停止"该方法,以等待返回任何内容,直到收到某些东西?我曾尝试设置一个等待BOOL的While循环,当收到所有数据时,该循环将被设置为YES,但该循环根本阻止代码发送。我还尝试将此方法的内容放到另一个方法中并调用performSelectorInBackground,但当然,这也不起作用。我已经没有主意了,我真的很感激你的帮助。

推荐答案

在主线程上执行任何类型的同步通信都不是一个好主意,但是如果您不能在这一点上重新设计,那么看看:

文档可在here找到。讨论内容:

但请认真了解一下,异步执行请求并在请求完成时接收通知需要做多少工作。用户的整体体验将会更好。

这篇关于等待NSURLConnection的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

11-01 19:06