【问题标题】:Does showing system image(SF symbols) use a networking call in Swift?显示系统图像(SF 符号)是否使用 Swift 中的网络调用?
【发布时间】:2021-12-04 15:20:27
【问题描述】:

我正在 ios 中创建一个应用程序,我使用 UITableView 和 UITableViewCell 从 api 加载图像。

由于 UITableView 重复使用单元格,所以当我快速滚动时会出现旧图像。为了防止这种情况,我使用系统图像(SF 符号)设置了默认图像。

我还使用缓存来存储图片的网址。

一切正常,但现在我想到了,我每次都发送网络请求来检索该 systemImage,这似乎非常低效,因为我首先使用缓存来减少总网络调用。

有没有办法解决这个问题,或者这是我必须做出的权衡?

代码如下。

        //use default image from SF symbols
        let defaulticon = UIImage(systemName: "photo")?.withTintColor(.gray, renderingMode: .alwaysOriginal)
        DispatchQueue.main.async {
            cell.mealImage.image = defaulticon
        }
        
        
        guard cell.meal?.strMealThumb != nil else {
            print("Category Image doesn't exist")
            return
        }
        
        
        //use cache
        if let imageData = model.imagecache.object(forKey: cell.meal!.strMealThumb as NSString) {
            print("using cache")
            DispatchQueue.main.async {
                cell.mealImage.image = imageData
            }
            
        }
        
        else {
            let url = URL(string: cell.meal!.strMealThumb)
            
            let session = URLSession.shared.dataTask(with: url!) { data, response, error in
                
                if error == nil && data != nil {
                    
                    let image = UIImage(data: data!)
                    //self.model.imagecache[cell.meal!.strMealThumb] = image
                    self.model.imagecache.setObject(image!, forKey: cell.meal!.strMealThumb as NSString)
                    DispatchQueue.main.async {
                        cell.mealImage.image = image
                    }
            
                }
            }
            
            session.resume()
            
        }
        

    }

【问题讨论】:

  • 如果创建系统映像需要网络调用,我会感到非常惊讶。如果设备断开连接(例如在飞行模式下),系统映像应该仍然可用。但是,我可以想象它可能需要一个进程间通信调用来获取系统映像。

标签: ios swift api caching uikit


【解决方案1】:

覆盖UITableViewCell 中的prepareForReuse 方法,并在此函数中添加代码以清理可能因先前使用单元格而保留的单行数据。在您的示例中,在此函数中分配默认图像以产生更好的结果。

【讨论】:

    【解决方案2】:

    你问:

    我使用系统图像(SF 符号)设置了默认图像。

    ...

    一切正常,但现在我想到了,我每次都发送网络请求来检索该 systemImage,这似乎非常低效,因为我首先使用缓存来减少总网络调用。

    不,UIImage(systemName:) 不发出网络请求。正如documentation 所说,它会缓存图像本身:

    此方法检查系统缓存以查找具有指定名称的图像,并返回最适合主屏幕的该图像的变体。如果匹配的图像对象不在缓存中,则此方法从指定的系统符号图像创建图像。系统可以随时清除缓存的图像数据以释放内存。仅对缓存中但当前未使用的图像进行清除。

    FWIW,您可以凭经验验证这不会执行与网络断开连接并尝试使用它的网络请求。即使断开连接,您也会看到它工作正常。


    FWIW,通过保留对该着色系统映像的引用并重新使用它,而不是获取缓存的系统映像并重新着色它,性能提升非常小(不到一毫秒?)。但性能提升微乎其微。

    【讨论】:

      猜你喜欢
      • 2020-06-20
      • 2020-10-25
      • 2020-07-21
      • 1970-01-01
      • 2019-11-30
      • 1970-01-01
      • 2020-02-08
      • 2011-08-06
      • 2011-08-06
      相关资源
      最近更新 更多