美文网首页
iOS OOM治理--SDWebImage解读:iOS图片加载框

iOS OOM治理--SDWebImage解读:iOS图片加载框

作者: iOS寻觅者 | 来源:发表于2023-09-30 10:31 被阅读0次

    引言:

    在现代的iOS应用开发中,图片加载是一个常见且重要的需求。为了高效地加载和缓存图片,开发者通常会选择使用专业的图片加载框架。而SDWebImage作为一款广泛使用的图片加载框架,不仅提供了强大的功能,而且具有简单易用的接口和高性能的表现。本文将对SDWebImage进行解读,包括其核心功能、使用步骤和实际案例,帮助开发者更好地了解和应用该框架。

    1. SDWebImage框架简介

    SDWebImage是一个功能丰富且高性能的iOS图片加载和缓存框架,可用于异步下载和缓存网络图片。它提供了简单而强大的API,支持多种网络协议(如HTTP、HTTPS、FTP)和图片格式(如JPEG、PNG、GIF等)。SDWebImage的核心特性包括:

    异步下载:通过多线程机制,在后台下载图片,避免阻塞主线程,提高用户体验。

    缓存支持:自动将下载的图片缓存在内存和磁盘上,下次访问时可以直接从缓存读取,减少网络请求。

    渐进式加载:可以逐步显示图片的内容,提升用户感知的加载速度。

    图片处理:支持图片的自定义处理,如裁剪、调整大小、添加滤镜等。

    取消和停止:提供了方便的取消和停止图片下载的方法,避免浪费网络资源和内存。

    1. SDWebImage的使用步骤

    以下是使用SDWebImage加载和显示图片的基本步骤:

    步骤1:导入SDWebImage库

    将SDWebImage库导入到您的项目中。您可以使用CocoaPods、Carthage或手动导入方式。

    步骤2:加载图片

    在您的代码中,使用UIImageView的扩展方法sd_setImage(with:)来加载图片,并指定图片的URL。

    import SDWebImage

    imageView.sd_setImage(with: URL(string: "https://example.com/image.jpg"))

    步骤3:自定义选项(可选)

    根据需要,您可以使用SDWebImage提供的自定义选项来调整图片加载的行为,如缓存策略、图片处理、占位图等。

    imageView.sd_setImage(with: URL(string: "https://example.com/image.jpg"),

    placeholderImage: UIImage(named: "placeholder"),

    options: [.progressiveLoad, .refreshCached])

    步骤4:取消图片加载(可选)

    如果需要,在适当的时候,您可以取消图片的加载请求,以避免不必要的网络请求。

    imageView.sd_cancel SDWebImage解读:iOS图片加载框架的优秀选择(续)

    1. SDWebImage实际案例演示

    为了更好地理解SDWebImage的实际应用,下面以一个图片浏览应用为例,展示如何使用SDWebImage加载和显示网络图片。

    假设我们的应用有一个图片列表页面,每个单元格显示一张网络图片。我们将使用SDWebImage来加载和缓存这些图片。

    导入SDWebImage库:

    在项目的Podfile文件中添加SDWebImage依赖,并执行pod install命令安装。

    在图片列表的视图控制器中,使用UITableView来展示图片单元格。

    import SDWebImage

    class ImageListViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!

    var imageUrls: [String] = [

    "https://example.com/image1.jpg",

    "https://example.com/image2.jpg",

    "https://example.com/image3.jpg"

    ]

    override func viewDidLoad() {

    super.viewDidLoad()

    tableView.delegate = self

    tableView.dataSource = self

    }

    // UITableViewDataSource方法

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return imageUrls.count

    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "ImageCell", for: indexPath) as! ImageCell

    let imageUrl = imageUrls[indexPath.row]

    cell.imageView.sd_setImage(with: URL(string: imageUrl))

    return cell

    }

    }

    class ImageCell: UITableViewCell {

    @IBOutlet weak var imageView: UIImageView!

    }

    在自定义的图片单元格中,我们使用SDWebImage提供的方法sd_setImage(with:)来加载和显示网络图片。

    通过以上代码,我们使用SDWebImage实现了图片列表页面,并通过UITableView展示了网络图片。SDWebImage自动处理了图片的异步下载和缓存,确保图片加载的效率和性能。

    1. 总结

    SDWebImage是一款优秀的iOS图片加载和缓存框架,通过其强大的功能和简单易用的接口,开发者可以轻松实现高性能的图片加载和缓存。本文对SDWebImage进行了解读,包括框架介绍、使用步骤和实际案例演示。

    通过SDWebImage,开发者可以减少开发工作量,提高图片加载的效率和用户体验。无论是简单的图片加载还是复杂的图片处理,SDWebImage都能满足需求并提供良好的性能。

    希望本文能够帮助开发者更好地理解和应用SDWebImage,从而优化iOS应用的图片加载和展示效果。使用SDWebImage,让图片加载变得更加高效和便捷

    大部分第三方框架并不是完美的,只是我们缺乏思考,后面会针对更多的第三方进行缺陷分析。

    SD的源码分析资源很多,这里简单总结下核心,在这个基础上分析下在性能方面上是否还有进一步的操作空间。

    SD的核心任务有两个:图片解码 + 缓存,这两个步骤都在子线程上处理的。

    核心一解码:如图,SDWebImageDecoder的部分代码,图片解码操作

    [图片上传失败...(image-26a51-1696127523070)]

    核心二缓存:如图,SDImageCache文件部分代码,图片存入缓存磁盘操作

    [图片上传失败...(image-3a1dbe-1696127523070)]

    注意,从代码上看SD存入本地是PNG或者JPG文件,也可以在沙盒找到SD相关的缓存文件夹来验证,是PNG和JPG。

    我们需要了解一点UIImagePNGRepresentation和UIImageJPEGRepresentation生成的PNG和JPG,是对图片进行了一次压缩编码,如果再次加载出来,是需要重新解码的。

    换个角度理解:图片压缩的PNG或者JPG格式,对应于文件压缩的zip或者rar格式,文件使用时需要对zip或者rar解码,图片显示时,需要对PNG或者JPG解码。

    可以尝试如下代码,对图片操作进行更深入的了解:

    [图片上传失败...(image-e60f14-1696127523070)]

    问题总结:

    一、SD存储到本地缓存时,对图片重新进行了一次编码。

    二、SD从本地缓存中加载图片时,需要重新对图片进行解码。

    编码和解码是比较消耗资源的操作,可以再这个步骤上进行再优化。

    优化方案:

    对本地缓存进一步优化,存储解码后的数据,可以省略掉上面问题总结提到的一、二涉及到的编码和解码操作。

    方案中,需要我们自定义数据结构进行存储,数据结构包含:图片属性格式 + 图片数据格式;图片文件属性数据格式,如图片的width,heigth,colorSpace,bitsPerComponent等;图片数据格式, 如RGBA像素数据。

    数据结构如:前100个字节是图片属性数据,后面的字节就是RGBA数据,
    前100个字节中,0到4个字节是图片的width,5到8个字节是图片的height,等等。

    方案的优劣分析:

    1、缺点:存储解码后的数据会占用更多的磁盘内存

    2、缺点:需要自定义数据结构进行存储,存入的文件不能像PNG或者JPG看到文件图像效果,本地化没有可视化效果

    3、优点:省略了部分编码和解码操作,性能得到提升,而且自定义数据结构可以看作是对图片的一种浅加密,只有熟悉你的数据结构,才能解码出图片

    相关文章

      网友评论

          本文标题:iOS OOM治理--SDWebImage解读:iOS图片加载框

          本文链接:https://www.haomeiwen.com/subject/pdsdbdtx.html