子线程更新UI 系统动画消失解决 iOS

670 阅读2分钟

一直以来工程里都有一个奇怪的现象:所有动画会莫名消失,包括控制器之间的切换

查看其他app并没有这种现象,所以确定是我们app的问题。

网上搜了一下,是非主线程更新ui导致的。

问题来了,工程里更新ui的地方这么多,该怎么把哪些非主线程更新ui的地方挑出来呢?

最原始的方法就是一个文件一个文件的改。显然这让我这个懒癌患者接受不了啊。【思路1】

有没有可能通过runtime拦截到ui更新的方法,然后检测是否是主线程?【思路2】

额……这需要了解一些系统的知识,才疏学浅的我一下子被巨大的困难打败了。

然后死马当活马医,我决定拦截view我能想到的、找到的、拦截得到的主流更新通道,然后检测是否是主线程。【思路3】

然后我就拦截的setFrame,然后还是很挫败,我就忘记了这件事。

隔一天调试的时候在断言处停住了,我一看,这不是我昨天拦截setFrame嘛,真的有用哎,真的拦截到了非主线程更新。

事情本身没啥技术含量,但这个结果是激励人的。它给了我信心。


接下来解决这个问题我的策略是:

一边沿着思路3前进,一边寻求更好的解决方法。更好解决方法突破点是facebook那个可以在非主线程更新UI的第三方库(是Facebook?可以非主线程更新UI?记不太清了)。


2017.8.18后记:

上面的runtime swizzle method确实解决了动画突然消失的问题。

下面附上我都把哪些方法强制切换到主线程:

UIImageView setImage:
UINavigationController pushViewController:animated
UITableView reloadData
UIView addSubview:
UIView removeFromSuperview
UILabel setText: