当我们开启子线程处理数据源的时候,主线程的操作并没有记录在子线程中。这样就会导致子线程处理完数据返回主线程刷新UI后数据错乱。
例:在tableView中显示新闻数据和广告,子线程进行网络请求,数据解析等操作的同时。主线程中删除了广告,并更新UI。然后子线程处理完数据,最终也在主线程中更新UI,子线程没有记录主线程的删除操作,导致数据源没有同步的问题。
解决办法如下
一,并发访问,数据拷贝
iOS 数据源同步问题 1.jpeg通过上图我们可以了解当主线程做了一次删除操作的时候,我们需要将这个操作记录下来,并且当子线程需要操作的时候进行一次主线程的删除操作,这样才能保证数据的正确性。
二,串行访问
iOS 数据源同步问题 2.jpeg串行访问的原理是通过GCD开辟一条串行队列,把数据操作的任务放到串行队列上面操作,这样可以同步主线程和子线程对数据源的操作。
三,利弊
以上两种方式都能解决数据源同步问题,但是这两种解决方案也是存在一定问题的。
首先并发访问数据拷贝,顾名思义是要对操作机型记录并拷贝到子线程中,这样需要开辟内存空间,对内存消耗较大。
其次串行访问,当线程有耗时操作时,就会导致对数据源的增删改查操作有延时。
原文作者:xiaoxiaobukuang
网友评论