繁体   English   中英

从不推荐使用的 sendSynchronousRequest 切换到 NSURLSession ,现在应用程序不会启动第一个活动

[英]Switched from sendSynchronousRequest deprecated to NSURLSession ,now app does not launch first activity

以前的代码

[NSURLConnection sendSynchronousRequest:请求返回响应:&响应错误:NULL]; 返回([响应状态代码] == 200)? 是:否;

现在使用的代码

+(BOOL)isConnectNetwork{

NSString *urlString = @"http://www.google.com/";
NSURL *url = [NSURL URLWithString:urlString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"HEAD"];
NSHTTPURLResponse *response;



  NSURLSession *session = [NSURLSession sharedSession];
   NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:
       ^(NSData *data, NSURLResponse *response, NSError *error) {
           // ...
    }];
   [task resume];
      }

我收到此错误2020-11-06 13:07:36.125607+0000 App[8518:1786305] [NetworkInfo] 信号强度查询返回错误:Error Domain=NSPOSIXErrorDomain Code=13“Permission denied”,描述符:<CTServiceDescriptor 0x2800006 =1, instance=1> 2020-11-06 13:16:03.381478+0000 App[8518:1786223] 无法为时间字符串加载 IOSurface。 而是在本地渲染。

非常不鼓励进行这种网络检查,因为它容易出错。 通常最好假设网络正在工作,直到真正的网络请求(您真正关心的事情)失败,然后适当地处理该失败(错误消息、背景颜色更改等)。

不这样做的原因是在移动设备上,网络可以在一秒钟内工作,而在一秒钟后就无法工作。 因此,像这样进行不必要的网络检查不会带来任何好处,但可能会降低您的应用程序的可用性(特别是如果您在该检查后面设置了任何功能,这同样是非常不鼓励的)。

我的建议是完全删除这个方法,并假装它总是返回 YES。 从长远来看,你会对这种方法更满意。 发生错误时处理错误。 不要试图寻找他们。

也就是说,如果您出于某种原因必须这样做,您将面临的问题是 NSURLSession 任务是异步的,但您正在尝试同步使用它。 因此,要完成这项工作,您需要

  • 使用 dispatch_async 块将所有这些代码包装到不同的调度队列中。
  • 在该块之外,阻塞运行该方法的线程,以便该方法不会返回。 您通常会通过等待信号量来做到这一点。
  • 在完成块内部,根据请求是成功完成还是失败来设置 __block BOOL 变量的值,然后发布到信号量以使外部代码停止等待。

但同样,这是非常不鼓励的。 在没有其他方法的地方(涉及我无法控制的 swizzling 代码),我已经这样做了作为一种解决方法,但除非没有其他方法,否则请不要这样做。 :-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM