微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决从不建议使用sendSynchronousRequest切换到NSURLSession,现在应用程序不会启动第一个活动

先前的代码

[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:NULL]; 返回([response statusCode] == 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]信号强度查询返回错误错误Domain = NSPOSIXErrorDomain代码= 13“权限被拒绝”,描述符: 2020-11-06 13:16:03.381478 + 0000 App [8518:1786223]无法为时间字符串加载IOSurface。而是在本地渲染。

解决方法

不建议进行这种网络检查,因为它容易出错。通常最好假设网络正在运行直到 real 网络请求(您实际上在乎的事情)失败,然后适当地处理该失败(错误消息,背景颜色更改,等等)

不这样做的原因是,在移动设备上,网络可以工作一秒钟,而在一秒钟后不能工作。因此,像这样进行不必要的网络检查不会带来任何好处,但有可能使您的应用程序无法使用(特别是如果您限制了该检查背后的任何功能,则再次不建议这样做)。

我的建议是完全删除此方法,并假装它始终返回YES。从长远来看,您会更满意这种方法。错误发生时进行处理。不要试图找出它们。

也就是说,如果出于某种原因必须执行此操作,那么您将面临的问题是NSURLSession任务是异步的,但是您尝试同步使用它。因此,要使其正常工作,您需要

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

但是,再次不鼓励这样做。在没有其他方法(涉及我无法控制的混乱代码)的地方,我已经将其作为解决方法,但是除非没有其他方法,否则请不要这样做。 :-)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。