通过预加载数据提高视图显示速度
1. 现状
以查看用商品情为例,在商品列表视图,点击列表后,进入商品详情视图。商品详情视图加载后,请求数据,数据返回后,绘制界面。
在进入详情视图,请求数据,数据还未返回的时间里,用户看到的是一个旋转的菊花以及一个空白的视图。这个时间可能是一个较长的等待时间。
从图中可以看出,整个流程是串行的。其中用户浏览列表视图和加载数据是占用时间相对较多的环节,而用户点击查看详情的事件,以及绘制商品详情视图所花费的时间是较短的。用户浏览列表视图的时间是不可能缩短的,或者说难以通过代码控制的,但是加载数据这个过程应该是可以的。理想的流程应该是这个样子:
2. 解决的方法
正如上一副图所示,数据加载的等待时间,可以放在用户点击进入商品详情视图的界面之前,正在浏览列表视图的时候同时进行,其中的关键是猜测用户将进入详情视图。
用户点击进入详情视图的前一个事件,应该是详情在列表里对应的cell进行了显示。只有在列表视图上可见的商品,才有可能被点击,进入详情视图。
浏览一下UITableViewDelegate的方法,可以知道,tableView(_:didEndDisplayingCell:forRowAtIndexPath:)
这个方法是比较合适的,它将在某个Cell显示之后进行调用。这时候,用户也看到了商品的简介,很可能会点击。而点击之前,必然会有这个方法的调用,而且用户不会马上点击,总有一个时间(当然,可能很短,半秒钟,或者一秒钟,但是这个时间通常来说,足够加载数据了。)
3. 其他
对于其他的视图(非UITableView为主的),思路是一致的,提前加载可能进入的视图的数据,在用户点击的时候,直接创建控制器,设置数据。通常来说,其他的会更简单一点。一般来说,只要在前一个视图Load显示完之后立即加载可能进入的下一个视图的数据就可以了: