显示系统图像(SF 符号)是不是使用 Swift 中的网络调用?

Posted

技术标签:

【中文标题】显示系统图像(SF 符号)是不是使用 Swift 中的网络调用?【英文标题】: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()
            
        
        

    

【问题讨论】:

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

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

【讨论】:

【参考方案2】:

你问:

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

...

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

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

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

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


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

【讨论】:

以上是关于显示系统图像(SF 符号)是不是使用 Swift 中的网络调用?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftUI 中基于 SF Symbols 获得相同大小的圆形图像?

swiftui 在您的项目中使用非 SF Symbols SVG

如何在swift 3中显示图像路径中的图像

SwiftUI 将 SF Symbol 作为文本与文本对齐

是否可以在UIImage之外使用SF符号?

通过在 modifyCell 中用新的 sf 符号 chevron.right 替换 V 形颜色来更改它