【发布时间】:2017-04-20 10:41:02
【问题描述】:
我的目标场景: 尝试向我的应用程序服务器发送一个简单的 HTTP 请求并获得一个 json 响应作为回报。根据 json 响应,我需要执行 segue 操作。
我目前的情景: 这发生在我的系统中。经过太多延迟后,我的 HTTP 请求得到了 json 响应,因为我的响应是在延迟之后执行的,甚至没有检查响应中的数据就执行了 segue。
我的要求 如何让我的 segue 等到我收到 HTTP 请求的响应?
[application getjsonResponse];
if([[defaults stringForKey:@"status"] isEqual:@"success"])
{
return YES;
}
这些是我使用的代码行。我不希望我的线程执行这个 if 条件,除非我得到对我的 HTTP 请求的响应。
到目前为止我尝试过的:
- 我尝试了线程睡眠方法,它有时有效,有时无效。
- 在我得到响应之前,我会迭代一个 while 循环。
好奇的问题
当我从桌面浏览器 (Chrome) 或移动浏览器向我的应用程序发出相同的请求时,我会立即得到响应,但是当我使用代码时,我似乎会在 10 秒或更长时间后得到结果。这是为什么呢?
这是我用来向我的应用服务器发送 http 请求的一段代码。
-(void)getjsonResponse
{
NSURL *url=[NSURL URLWithString: URLForApplication];
NSURLRequest *req=[NSURLRequest requestWithURL:url];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask connection=[session dataTaskWithRequest:req completionHandler:^(NSData data, NSURLResponse response, NSError error)
{
if (!error){
// Success
if ([response isKindOfClass:[NSHTTPURLResponse class]])
{
NSError *jsonError;
NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError];
if (jsonError)
{ // Error Parsing JSON
}
else
{ // Success Parsing JSON
// Log NSDictionary response:
NSLog(@"%@",jsonResponse);
{
NSString * statusCode=[[NSString alloc]init];
statusCode=jsonResponse[@"statusCode"];
_statusOtpResponse=jsonResponse[@"status"];
NSLog(@"status value: %@",_statusOtpResponse);
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:_statusOtpResponse forKey:@"status"];
[defaults setObject:statusCode forKey:@"statuscodeOtp"];
[defaults synchronize];
}
}
}
else
{
//Web server is returning an error
}
}
else
{
// Fail
NSLog(@"error : %@", error.description);
}
}];
if(connection){
[connection resume];
}
【问题讨论】:
-
所以请使用正确的语法。此外,停止 UI 线程通常是一个非常糟糕的主意 - 它会使 GUI 响应并让用户认为应用程序可能崩溃了。
-
@tambre 所以我不想停止 ui 线程如何让 ui 线程等到我从 http 请求中得到响应请帮忙..
标签: ios objective-c