You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中加载SF Symbols系统图片是否会发起网络请求?

核心结论

你担心的加载systemImage会发起网络请求的问题完全不存在,UIImage(systemName:)读取的是iOS系统内置的本地资源,全程不会产生网络请求,加载性能极高,和你通过缓存减少网络请求的初衷没有任何冲突,不需要做取舍。


现有代码优化建议

以下优化可以进一步提升列表滑动流畅度、避免潜在问题:

  • 优化占位图创建逻辑:将占位图声明为全局静态常量,避免每次cell复用时重复创建同一份占位图,进一步降低性能损耗
// 在视图控制器或自定义Cell类的顶层定义一次即可
private let placeholderImage = UIImage(systemName: "photo")?.withTintColor(.gray, renderingMode: .alwaysOriginal)

// cell复用时直接赋值
DispatchQueue.main.async {
    cell.mealImage.image = placeholderImage
}
  • 修复快速滚动时的图片错乱问题:当前逻辑下,如果cell被快速复用,之前发起的旧网络请求回调后可能给cell设置错误的图片,需要在回调时校验url一致性
else {
    // 先保存当前cell需要加载的目标URL
    let targetThumbURL = cell.meal!.strMealThumb
    let url = URL(string: targetThumbURL)
    
    let session = URLSession.shared.dataTask(with: url!) { data, response, error in
        guard error == nil, let data = data, let image = UIImage(data: data) else { return }
        self.model.imagecache.setObject(image, forKey: targetThumbURL as NSString)
        DispatchQueue.main.async {
            // 只有当前cell对应的url和请求url一致时才设置图片
            if cell.meal?.strMealThumb == targetThumbURL {
                cell.mealImage.image = image
            }
        }
    }
    session.resume()
}
  • 可选优化:给缓存增加容量限制,避免缓存占用内存过多被系统强制回收
// 初始化缓存时设置
let imageCache = NSCache<NSString, UIImage>()
imageCache.countLimit = 100 // 最多缓存100张图片
imageCache.totalCostLimit = 1024 * 1024 * 50 // 缓存最大占用50MB内存

内容的提问来源于stack exchange,提问作者mendokusai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 16:36:03