iOS- UITableView数据源同步

2020-06-16  本文已影响0人  时米高的人生笔记
  1. 并发访问,数据拷贝

我们来看一幅时序图

多线程并发访问数据源

主线程对数据源1 进行了删除操作,得到数据源2;
子线程对数据源1 进行数据解析预排版等操作,得到数据源3;
最后主线程reload UI时,从子线程拿到的是数据源3,而数据源3里是含有被删除的哪一行数据的;
这就造成了被删除的数据又被刷出来的bug;
怎么解决呢?

数据拷贝的解决方案

在主线程对数据源1进行删除操作得到数据源2时,记录下删除操作;
子线程完成网络请求数据解析后,同步下删除操作,这样得到的数据源和2相同;
最后,主线程reload UI 时,数据源也是和2是一样的。

2. 串行访问
还有一种串行访问的解决方案:不管是子线程还是主线程,对tableView的数据源操作都提交到串行队列上,来避免数据源错乱问题。

串行访问数据源流程

子线程把 对数据源1的网络请求/数据解析等操作提交到 串行队列;
串行队列对新增数据进行预排版等操作;
主线程删除数据后,把删除操作异步提交到串行队列,waiting 串行队列完成同步数据操作(这里要注意是 【异步提交】);
最后等串行队列完成数据删除的同步,得到数据源2,返回给主线程reload UI。

这两种方案各有利弊:

在开发过程中,可以根据项目的实际应用场景来决定采用哪种方案。

上一篇 下一篇

猜你喜欢

热点阅读