前提:
测试最近测出了一个比较奇怪的问题,反复点击蓝牙跟定位打开设置页面,操作频繁了之后,整个APP就会卡死;
分析:
APP卡死第一反应就是主线程被阻塞,打开xcode调试,果不其然,在openURL的时候,有加信号量锁,而且openURL还是在主线程执行的,所以当open的过程还没有执行完成的时候,再去执行open,当前线程势必会进入无限等待的过程;
因为这是之前同事写的模块,通过仔细观察这个东西,再对比我现在使用的方法;
发现调用的API有点不同,果然苹果在很早之前就发现了这个问题,所以在iOS10以后就把这个API给弃用了,新的API采用了异步回调返回执行结果,不用同步等待执行结果完成,这样一来也就避免了主线程卡死的问题;
image image以前的做法是开启个异步队列处理也可以解决这一问题:
dispatch_async(dispatch_get_main_queue(), ^{
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url];
}
});
总结:被弃用的东西肯定有被弃用的原因,我们也有理由去同步研究新的东西及其修改,与时俱进,方能不被淘汰;
参考:
网友评论