文章目录

  • 前言
  • 一、问题来源
  • 二、具体场景及现有方案问题描述
  • 1.场景
  • 2.当前方案
  • 3.问题
  • 三、解决方案
  • 四、部分测试数据对比


前言

本文主要是讲对UITableView以及UICollectionView的一些使用场景和注意事项,如何利用UITableViewCell和UICollectionViewCell的重用去提升APP的交互体验。

一、问题来源

最近在对我们的应用进行一些性能上的优化,发现其中一个图片预览界面在添加的图片数量较多时十分卡顿,于是开始查找原因,发现实现方案存在问题——没有展示在界面的图片视图也会创建,没有想到重用,每次加载时都会创建新的一个视图。

二、具体场景及现有方案问题描述

1.场景

假设需要展示一些图片的缩略图,图片分为m组,每组有n张图片。

示意图1:

2.当前方案

整体使用UITableView进行展示,每一个UITableViewCell展示一组图片,每个UITableViewCell内部使用UIScrollView作为容器,将一组的图片进行展示。
其中UITableView使用了cell的重用,但是UIScrollView内每次使用时都会重新创建对应图片个数的item。

示意图2:

3.问题

这种实现在图片数量较多时,每次滚动列表时,都会频繁的创建对应数量的item,不仅耗费性能,而且没有显示的item创建还会占用大量的内存。

三、解决方案

这种场景下可以替换UIScrollView为UICollectionView,即每个UITableViewCell中添加一个UICollectionView来展示单个小组的图片,图片数量多时,没有展示的部分图片就会利用UICollectionView的重用机制被放回到重用池,需要展示时只需要取出并刷新UI就可以了。
这时图片增长不仅不会大量增加内存损耗,也不会因为频繁的创建而耗费内存了。

四、部分测试数据对比

修改前后使用xcode core animation工具在图片共4组,每组55张情况下的FPS数据:

注:上为修改后,下为修改前。处于交互(点击、轻扫等事件触发)状态下FPS值越接近60,界面卡顿越轻微。