重用机制
代码
cell = [tableView dequeueReusableCellWithIdentifier:identifier];
机制
- 系统会创建当前屏幕cell数+1个cell
- 对UITableView向上滑动时,当第一个单元格完全滑出屏幕后,此时就会被加入到重用池中,接下来继续向上滑动时,当一个新的单元格出现时,就会根据指定的identifier标示符,从重用池中取出一个可重用的cell
作用
- 避免大量创建实例对象,减少内存消耗,从而提高滑动流畅性
数据源同步问题
场景描述
- UITableView有一个数据源datasource,用户对datasource进行了删除某一个元素的操作,与此同时向服务器请求数据,请求后的数据会对datasource进行赋值操作,此时就产生了数据源同步的问题
分析
- 用户删除操作是在主线程,请求数据并赋值操作是在子线程,俩个线程会同时对datasource进行操作,会产生数据源同步问题
解决方式
- 并发访问、数据拷贝的方式:当用户进行删除操作后,将删除的元素进行拷贝记录,当请求数据时,用拷贝的元素与请求数据进行对比,然后进行同步的删除操作,最后再对datasource进行赋值,这样就解决了数据源同步问题(数据源数据较大时,会有拷贝带来的性能损耗)
- 串行访问的方式:(请求数据时间过长时,会对删除操作有延时)
//串行队列
dispatch_async(serial,^{
//子线程网络请求,数据解析
})
//串行队列
diapatch_sync(serial,^{
//主线程中删除datasource的某一个元素,因为是被加入到了串行队列,因此删除操作需要等待网络请求和数据解析结束后才能进行
})
dispatch_sync(main,^{
//更新ui
})
网友评论