【问题标题】:Objective C https requests not waiting response before resuming main threadObjective C https请求在恢复主线程之前不等待响应
【发布时间】:2018-10-12 09:21:23
【问题描述】:

我的 https 请求有问题(我认为是问题所在)。我的问题是我有一个登录页面,它要求我编写的一个 php Web 服务来检查尝试登录的用户是否可以这样做。 从 Xcode 启动应用程序时 Https 请求工作正常,但经过苹果验证后,我在 App Store 上发布了应用程序,但不知何故,当我从 App Store 下载它时,当我按下启动请求的登录按钮时,应用程序冻结...

这是我的请求代码:

NSString *url = [NSString stringWithFormat:@"https://cataloguetest.tabuleo.fr/Appmobile/webServ_firstCo.php?username=%@",username];
__block BOOL endOfBlock = false;
__block NSArray *ret;
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setHTTPMethod:@"GET"];
[request setURL:[NSURL URLWithString:url]];

[[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:
  ^(NSData * _Nullable data,
    NSURLResponse * _Nullable response,
    NSError * _Nullable error) {

      NSString *strData = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
      NSLog(@"Data received: %@", strData);
      NSError *jsonerror;
      NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonerror];
      NSString *validity =[jsonDict objectForKey:@"valid"];
      NSLog(@"get validity ok..");
      NSString *userInbase = [jsonDict objectForKey:@"usrIn"];
      NSLog(@"validity: %@",validity);
      NSLog(@"inBase: %@", userInbase);
      ret = @[validity ,userInbase];
      endOfBlock = true;
  }] resume];
while (!endOfBlock) {};

感谢您的帮助。

【问题讨论】:

  • 不要将异步调用转换为同步调用。了解如何正确处理异步调用。
  • @Larme 好吧,也许这是我做错了,但我真的需要等到我的通话结束后再继续我的通话..知道如何做或在哪里可以学习如何做做这种事?

标签: ios objective-c https request ios-simulator


【解决方案1】:

好的,我设法找到了几乎完美的方法:

NSString *urlCheck = [NSString stringWithFormat:@"YOUR URL"];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setHTTPMethod:@"POST"];
[request setURL:[NSURL URLWithString:urlCheck]];
[[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:
^(NSData * _Nullable data,
NSURLResponse * _Nullable response,
NSError * _Nullable error) {
  //do things with request's return
}] resume];

while(!postRequestReturned){

[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate          distantFuture]];

}
NSLog(@"REQUEST resumed main thread");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 2020-01-18
    • 2020-04-20
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多