图片框架MWPhotoBrowser详解(二)

(二)MWPhotoBrowser图片加载过程及内存优化

进入MWPhotoBrowser框架后,主要的操作都在reloadData方法中:


图片框架MWPhotoBrowser详解(二)_第1张图片
reloadData方法.jpg
重置:
  • 1、图片总数置空;
  • 2、将除当前图片外的所有图片在内存中释放,并将所有缩略图释放;
  • 3、清空加载图片数组和加载缩略图的数组;
  • 4、重新加载布局;

其中,第二步将_photos中的除了当前图片的所有图片释放并移除。其中调用了 MWPhoto的 unloadUnderlyingImage方法,这个方法是将图片浏览器中所有图片(或含当前图片)释放。

第四步, performLayout方法中调用tilePages方法在首次进入时,会对管理图片内存的两个重要属性 visiblePages和recycledPages初始化


图片框架MWPhotoBrowser详解(二)_第2张图片
内存优化-代码块.jpg

自己总结成流程图如下:

图片框架MWPhotoBrowser详解(二)_第3张图片
内存优化-首次进入-流程图.png

在代码Line812, [self configurePage:page forIndex:index];会对第一张图片进行加载,并在加载完成后发出加载完成的通知。
加载过程:

图片框架MWPhotoBrowser详解(二)_第4张图片
图片加载过程-代码块.jpg

加载图片的流程图如下:

图片框架MWPhotoBrowser详解(二)_第5张图片
图片加载过程-流程图.png

加载完成时发出通知的过程总结为流程图如下:

图片框架MWPhotoBrowser详解(二)_第6张图片
图片加载完成发出通知.png

其中的加载相邻图片,在第一次进入时,会加载第二张图片。而之后的加载相邻图片都是在滑动过程中进行的,也就是在 scrollViewDidScroll方法中,根据当前页来加载当前页前后两张的图片,对应代码块如下:

图片框架MWPhotoBrowser详解(二)_第7张图片
加载相邻图片的代码块.jpg

而对于图片浏览滑动时的 MWZoomingScrollView的复用,主要是 visiblePages和recycledPages这两个集合来管理的。当前可见的MWZoomingScrollView存放在visiblePages中,其一般数量不会超过2,而recycledPages中存放的MWZoomingScrollView用来循环利用,可能是新创建的MWZoomingScrollView,也可能是不可见的废弃的MWZoomingScrollView,一般用于循环的数量也不会超过2。

下面我们在操作过程中,对应相应代码块:

图片框架MWPhotoBrowser详解(二)_第8张图片
内存优化-代码块.jpg

可以观察到这两个参数的变化,理解其内存优化的具体过程:

1、首次进入
  • (1)、当前可见page的索引范围为:0 <= x <= 0;
  • (2)、此时_visiblePages为空,_recycledPages为空;
  • (3)、判断index是否都在_visiblePages范围(0 <= x <= 0)内;
  • (4)、_visiblePages此时为空,因此0不在该范围,_visiblePages也不包含当前索引对应页;
  • (5)、添加当前索引0所对应的新的 MWZoomingScrollView,因为_recycledPages为空,也不能提供循环利用的page,因此只能重新创建一个新的page;
  • (6)、对这个新的page的frame进行配置,并加载其image,然后添加到_visiblePages和_pagingScrollView;
  • (7)、此时_visiblePages个数为1,_recycledPages为空;
2、第一次左滑过程中:
  • (1)、当前可见page的索引范围为:0 <= x <= 1;
  • (2)、此时_visiblePages个数为1,_recycledPages为空;
  • (3)、判断index是否都在_visiblePages范围(0 <= x <= 1)内;
  • (4)、_visiblePages的个数此时为1,0在该范围,所以不用设置;1不在该范围,_visiblePages不包含当前索引对应页;
  • (5)、添加索引1所对应的新的 MWZoomingScrollView,因为_recycledPages为空,也不能提供循环利用的page,因此只能重新创建一个新的page;
  • (6)、对这个新的page的frame进行配置,并加载其image,然后添加到_visiblePages和_pagingScrollView;
  • (7)、此时_visiblePages个数为2,_recycledPages为空;
3、第一次左滑完成:
  • (1)、当前可见page的索引范围为:1 <= x <= 1;
  • (2)、此时_visiblePages个数为2,_recycledPages为空;
  • (3)、判断_visiblePages中看过的页是否还在可见范围(1 <= x <= 1)内;
  • (4)、将不在可见范围(1 <= x <= 1)内的MWZoomingScrollView,存入_recycledPages,并从_visiblePages中删除;
  • (5)、现在_visiblePages范围变成了(1 <= x <= 1),此时_visiblePages个数为1,_recycledPages个数为1;
  • (6)、判断index是否都在_visiblePages范围(1 <= x <= 1)内;
  • (7)、_visiblePages的个数此时为1,1在该范围,所以不用设置;
4、第二次左滑过程中:
  • (1)、当前可见page的索引范围为:1 <= x <= 2;
  • (2)、此时_visiblePages个数为1,_recycledPages个数为1;
  • (3)、判断index是否都在_visiblePages范围(0 <= x <= 1)内;
  • (4)、_visiblePages的个数此时为1,1在该范围,所以不用设置;2不在该范围,_visiblePages不包含当前索引对应页;
  • (5)、添加索引2所对应的新的 MWZoomingScrollView,因为_recycledPages个数为1,可以提供循环利用的page,因此直接返回这个page,并从_recycledPages中删除;
  • (6)、对这个page的frame进行配置,并加载其image,然后添加到_visiblePages和_pagingScrollView;
  • (7)、此时_visiblePages个数为2,_recycledPages为空;
5、第二次左滑完成:
  • (1)、当前可见page的索引范围为:2 <= x <= 2;
  • (2)、此时_visiblePages个数为2,_recycledPages为空;
  • (3)、判断_visiblePages中看过的页是否还在可见范围(2 <= x <= 2)内;
  • (4)、将不在可见范围(2 <= x <= 2)内的MWZoomingScrollView,存入_recycledPages,并从_visiblePages中删除;
  • (5)、现在_visiblePages范围变成了(2 <= x <= 2),此时_visiblePages个数为1,_recycledPages个数为1;
  • (6)、判断index是否都在_visiblePages范围(2 <= x <= 2)内;
  • (7)、_visiblePages的个数此时为1,2在该范围,所以不用设置;

由此可以看出, visiblePages和recycledPages这两个集合是如何管理MWZoomingScrollView图片加载时的内存和循环利用的。

这个思路并不难,但是要把每一步的逻辑处理做到完美,还需要注意很多细节。

你可能感兴趣的:(图片框架MWPhotoBrowser详解(二))