首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >等待NSURLConnection

等待NSURLConnection
EN

Stack Overflow用户
提问于 2011-09-28 00:44:49
回答 2查看 1.8K关注 0票数 0

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

旧的方法如下:

代码语言:javascript
复制
-(NSData*) postData: (NSString*) strData;

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

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

代码语言:javascript
复制
-(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
}

它可以很好地发送代码,但当然(正如预期的那样),它接收代码的速度不足以正确返回。

你建议我怎么做才能“停止”这个方法,让它等待返回任何东西,直到收到东西?我曾尝试设置一个while循环,该循环等待在接收到所有数据时被设置为YESBOOL,但该循环根本阻止了代码发送。我还尝试将此方法的内容放入另一个方法中,并将其调用到performSelectorInBackground,但当然,这也不起作用。我的想法快用完了,我真的很感谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-28 00:53:08

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

+NSURLConnection sendSynchronousRequest:returningResponse:error:

文档可以在here上找到。从讨论中:

同步加载建立在该类提供的异步加载代码之上。当异步加载系统在专门为该加载请求派生的线程上执行URL加载时,调用线程被阻塞。为了执行同步加载,在调用线程中不需要特殊的线程或运行循环配置。

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

票数 2
EN

Stack Overflow用户

发布于 2011-09-28 01:25:08

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

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

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

干杯

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7572713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档