等待NSURLConnection

时间:2011-09-27 16:44:49

标签: objective-c ios nsurlconnection

我的代码会发送HTTP 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,但当然,这也不起作用。我的想法已经不多了,我非常感谢你的帮助。

2 个答案:

答案 0 :(得分:2)

在主线程上进行任何类型的同步通信都是一个坏主意,但如果你现在无法重新构建,那么请看看:

  

+ [NSURLConnection sendSynchronousRequest:returningResponse:error:]

可以找到文档here。从讨论开始:

  

同步加载构建在异步加载代码之上   由班级提供。调用线程被阻塞了   异步加载系统在生成的线程上执行URL加载   专门针对此加载请求。没有特殊的线程或运行循环   在调用线程中需要配置才能执行   同步负载。

但严重的是,看看在请求完成时异步执行请求和接收通知将涉及多少工作。用户的整体体验会更好。

答案 1 :(得分:0)

您实际上是在那里执行异步请求。

要执行同步请求,您应该在+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error类中使用NSURLConnection

虽然在你这样做时阻止应用程序确实是一个坏主意,因此通常不鼓励。

干杯