现在的位置: 首页 > 综合 > 编程语言 > 正文

使用GCD加载传送图片

2019年12月25日 综合, 编程语言 ⁄ 共 1199字 ⁄ 字号 评论关闭

  我们可以看到+imageWithContentsOfFile:方法并不在CPU时间轨迹的最顶部,所以我们的确修复了延迟加载的问题。问题在于我们假设传送器的性能瓶颈在于图片文件的加载,但实际上并不是这样。加载图片数据到内存中只是问题的第一部分。

使用GCD加载传送图片

  如果有很多张图片要显示,最好不要提前把所有都加载进来,而是应该当移出屏幕之后立刻销毁。通过选择性的缓存,你就可以避免来回滚动时图片重复性的加载了。

  缓存其实很简单:就是存储昂贵计算后的结果(或者是从闪存或者网络加载的文件)在内存中,以便后续使用,这样访问起来很快。问题在于缓存本质上是一个权衡过程-为了提升性能而消耗了内存,但是由于内存是一个非常宝贵的资源,所以不能把所有东西都做缓存。

  何时将何物做缓存(做多久)并不总是很明显。幸运的是,大多情况下,iOS都为我们做好了图片的缓存。

  [UIImageimageNamed:]方法

  之前我们提到使用[UIImageimageNamed:]加载图片有个好处在于可以立刻解压图片而不用等到绘制的时候。但是[UIImageimageNamed:]方法有另一个非常显著的好处:它在内存中自动缓存了解压后的图片,即使你自己没有保留对它的任何引用。

  对于iOS应用那些主要的图片(例如图标,按钮和背景图片),使用[UIImageimageNamed:]加载图片是最简单最有效的方式。在nib文件中引用的图片同样也是这个机制,所以你很多时候都在隐式的使用它。

  但是[UIImageimageNamed:]并不适用任何情况。它为用户界面做了优化,但是并不是对应用程序需要显示的所有类型的图片都适用。有些时候你还是要实现自己的缓存机制,原因如下:

  [UIImageimageNamed:]方法仅仅适用于在应用程序资源束目录下的图片,但是大多数应用的许多图片都要从网络或者是用户的相机中获取,所以[UIImageimageNamed:]就没法用了。

  [UIImageimageNamed:]缓存用来存储应用界面的图片(按钮,背景等等)。如果对照片这种大图也用这种缓存,那么iOS系统就很可能会移除这些图片来节省内存。那么在切换页面时性能就会下降,因为这些图片都需要重新加载。对传送器的图片使用一个单独的缓存机制就可以把它和应用图片的生命周期解耦。

  [UIImageimageNamed:]的缓存机制

  [UIImageimageNamed:]缓存机制并不是公开的,所以你不能很好地控制它。例如,你没法做到检测图片是否在加载之前就做了缓存,不能够设置缓存大小,当图片没用的时候也不能把它从缓存中移除。

  构建一个所谓的缓存系统非常困难。菲尔卡尔顿曾经说过:“在计算机科学中只有两件难事:缓存和命名”。

  结束语:以上就是有关使用GCD加载传送图片的全部内容,更多内容请关注学步园。

抱歉!评论已关闭.