1.副线程刷新UI问题
一个view已经removeFromSuperView了,可是界面上还是有它,甚至dealloc方法都有已经调用了。然后过了1分钟左右,才自己消失
一开始以为是UI线程被阻塞,导致界面没有刷新,后来发现alertView弹框是正常的,点击也有效果。
然后仔细观察了下手机的日志信息,在Xcode的控制台(Console)里没有看到任何信息,然后在window->device里面看整个手机的日志信息,发现在后面自动消失的时候,有了一句话:
CoreAnimation: warning, deleted thread with uncommitted CATransaction; set C
带有CoreAnimation,我猜就是和这个显示的bug有关了,查了下,在stackoverflow里查到了一个原因:在副线程执行了UI操作。
把removeFromSuperView放到主线程果然好了。以前以为在副线程操纵UI,只会导致奔溃或者没有问题,没想到会有延迟更新。
2017.5.25 更新
评论里朋友提了个好问题,关于为什么副线程修改没有及时响应。
原因就是报错提示里说的那样,CATransaction没有提交。负责绘制的Core Animation会把CATransaction提交的layer更新提交给GPU去显示。主线程有个默认开启的CATransaction,会自动追踪layer的改变,所以主线程会迅速反应。我做了测试:
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[CATransaction begin];
[_testView removeFromSuperview];
[CATransaction commit];
});
如果主动提交,则会立马更新界面。
主要参考了微信开发公众号的这篇文章,非常好!