UITableView调用reloadData不刷新的Bug

    今天做项目的时候遇到一个问题,就是我们在AppDelegate中加载了两个view视图,都包含UITableView,一个当前可见(AView),一个当前不可见(BView)。当在可见(AView)的View中选择Cell的时候会同步到BView中。


    恩……我们在模拟器上调试程序的时候一切正常,但是使用版本为ios 4.x & 5.x & 6.x的iPhone 4时都会出现选到大于6条数据的时候,BView里只显示少量或者干脆没有数据。我们打断点的时候得知NSArray中数据存在并没有丢失,而且iPhone 4S调试也正常,仅仅只是iPhone4有问题,这就比较奇怪。


    首先我们认为这个Bug属于内存硬件问题,因为模拟器和4S一切正常,所以排除逻辑问题,我们认为是左边的Cell过多,导致系统内存吃紧回收了隐藏的BView视图中的对象。可是通过分析Log和设置断点,我们发现系统并没有上报关于Memory low的相关信息,而且也没有调用viewDidUnload和didReceiveMemoryWarning。所以最终我们排除了内存问题。

    这样开来只能是逻辑问题了,但是不科学的是逻辑问题为什么模拟器和4s没法复现?于是在大量的代码优化和调试之后,我们终于定位到BView数据存在问题的原因是调用了BView中UITableView的reloadData,但是没有回调其Delegate的numberOfRowsInSection和CellForRow,所以导致界面没有更新。


    然后360了一下,发现有很多人遇到了类似的问题,至少我们的原因是在一个子线程中调用了reloadData,所以导致概率没有刷新UITableView。解决的办法很简单,就是把reloadData perform到主线程里就可以了。


    这个事情虽然解决了,但是需要注意的是:

    1.在安卓中子线程是不能修改UI的,在IOS中应该也不行。虽然系统没有报错且可以正常运行,但是以后写代码还需要尽量注意。

    2.viewDidUnload不仅在视图release的时候会调用,在内存吃紧的时候同样会调用

    3.这个Bug我们只能暂且认为是iPhone4的CPU太挫了,子线程高速计算不及时导致的Bug。不管怎么说这问题是代码逻辑问题。


你可能感兴趣的:(UITableView调用reloadData不刷新的Bug)