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
相关产品推荐
相关产品推荐

