起因:对现有解决方式的优化
针对项目里商品详情页面有TableViewCell嵌套webView的情况目前网上有以下几种解决方案
1.网络请求完成后先给一个默认高度100 然后遍历数组拿到需要需要获取高度的数据对象通过去创建临时WebView 获取到高度刷新单个单元格 或者等待全部获取完毕再刷新TableView
优点:简单方便好理解
缺点:对代码侵入性太强,在当前类增加很多不必要的计算,每次进入这个页面加载的时候Cell都会抖动,并且因为创建大量的WebView只能是同步任务创建加载,进入页面后会卡死一会
2.给Cell设置不复用,每次用到需要加载WebView的代码都创建一个新的Cell,在新创建的Cell里边创建两个WebView,一个是临时的,一个是正式的,临时的计算出来Web高度后通知TableView刷新某个单元格
优点:外部无感知 无侵入 Cell之间互不影响
缺点:大量的Cell计算 逐个通知TableView刷新高度 ,因为WebView也是同步加载,也是造成一定的抖动和卡顿,同上每次进入页面都有这个难受的过程
3.封装工具类 传入需要加载的htmlString 或者 Url,MD5对其加密使其key长短规整,同步串行创建webView获取到高度后缓存到cache内存一份,再缓存一份到disk磁盘一份,这点借鉴了SDWebImage的思想,但是有一定区别,SDWebImage是异步执行并行队列,这里UI操作无法实现这种方式
优点:避免了每次进入此页面都需要计算的麻烦,并且暴漏代码少,对原有代码侵入性小
缺点:因为对UI的操作只能同步执行所以 还是有点卡顿 目前是监听tabVlew 是否正在滑动来处理,用户感知效果会好一点
以上废弃 不行,无论怎么样都改变不了web加载需要在主线程的操作,都会耗时,最好的办法要么用scrollerView 要么就是让后端返回图片