问题: 请说一下tableview的数据源同步问题, 都有哪些解决方法
或者问: 多线程对tableview同一共享数据源操作 都有哪些解决方法
我们看下一个例子, 方便理解理解这个问题
例子针对tableview
, 要同步进行操作
, 数据变更
怎么处理 ?
下面方法我都拿这个场景举例:
tableview
初始数据为[A, B, C]
, 主线程做个删除操作, 删除B
。子线程做个请求加载, 加载[D, E, F]
。最终目的以返回 [A, C, D, E, F]
刷新UI
方法一: 并发访问
方法一例子- 子线程拷贝一份数据1:[A, B, C], 进行数据请求
- 主线程删除B, 变为 [A, C] 刷新UI, 此时子线程还在数据请求, 暂未返回应答
- 子线程数据请求完成, 变成数据3 [A, B, C, D, E, F], 返回
- 以数据3 [A, B, C, D, E, F] 刷新UI
很明显是错误的
稍微改动一下
并发访问解决方法在删除操作之后, 我们做一个记录操作
, 而在子线程数据返回之后, 我们同步操作
, 已达到数据正常返回的目的
缺点
: 记录操作会做额外的开销
方法二: 串行访问
串行访问是大家写业务最常用的方法
串行访问解决方法由于是串行访问, 那么肯定有一串行队列
- 子线程中进行网络请求/数据解析结果方法串行队列, 进行新增数据预排版等操作, 此时主线程删除操作等待
- 串行队列处理完子线程数据之后, 同步主线程删除操作
- 刷新UI
缺点
: 如果子线程操作耗时情况下, 主线程的操作要一直延时等待
总结:
2种方法实际都各有利弊, 针对于不同场景使用不同方法
网友评论