今天碰到一个试图present一个视图Crash的问题,按道理来说,去present一个视图不应该出现这种情况,后来经过与测试人员人员沟通才得知,只有在出现帐号异常的情况下,去打开附件页面的时候才会出现,然后就顺着这条线索查找,最终找到原因,是因为服务端接口返回帐号异常错误之后呢,通过通知中心去帐号异常页面present出来,这种逻辑是没有问题的,但是确实是在出现帐号异常之后出现了Crash,Why?再仔细查看发现,这个帐号异常页面是个单例,而且present这个页面的时候还有判断该页面是否已经present出去了,如果已经打开,就直接return,奇怪的是没有走判断是否已经打开的逻辑。
工程里面打开这个帐号异常的地方就一个,是通过通知中心进行回调的,那就从通知中心回调查找入手,最终发现由于这个接口异常错误返回不止一个接口会触发,因为网络请求是全局的,触发多次是也有可能的,这个Crash的问题就是触发再次这个通知回调,这就与bugly反馈的信息对上了,附图如下:
问题找到了,就知道怎么解决了,主要是判断当前帐号异常页面是否已经present失效导致,
self.presentingViewController != nil
即两次调用异常页面show方法时判断self.presentingViewController是否为nil失效,为了解决这个问题,在通知中心回调时延时1秒再去调用异常页面的Show方法,这样第二次再回调时,判断self.presentingViewController已经有值,就不会再去试图present一个已经存在的ViewController.