一直以来工程里都有一个奇怪的现象:所有动画会莫名消失,包括控制器之间的切换
查看其他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: removeFromSuperview
UILabel setText: