Search code examples
iosswiftcachinguikit

Does showing system image (SF symbols) use a networking call in Swift?


I'm creating an application in iOS where I load images from an API using a UITableView and UITableViewCell.

Since the UITableView reuses cells, old images were appearing when I scroll fast. In order to prevent this, I set a default image using a system image (SF symbols).

I also use a cache to store URLs to images.

Everything works as it should but now I think of it I'm sending a network request to retrieve that systemImage each time which seems incredibly inefficient since I was using a cache in order to reduce the total network calls in the first place.

Is there way around this or is this a tradeoff I must make?

Code is below:

    //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()
        
    }
    

}

Solution

  • Override prepareForReuse method in UITableViewCell and add code in this function to clean up unrequited data that could persist from previous usage of the cell. In your example assign the default image in this function to produce better result.