Junior — Middle
Μπορείς να μοιραστείς ένα παράδειγμα τεχνικής βελτίωσης που έγινε στο έργο και να περιγράψεις την υλοποίησή της;
sobes.tech AI
Απάντηση από AI
Σε ένα από τα έργα μου iOS, βελτίωσα την απόδοση φόρτωσης εικόνων στη λίστα (UITableView) μέσω της υλοποίησης caching και ασύγχρονης φόρτωσης.
Υλοποίηση:
- Χρησιμοποίησα το
NSCacheγια την αποθήκευση ήδη φορτωμένων εικόνων, αποφεύγοντας την επαναφόρτωσή τους από το δίκτυο. - Στη μέθοδο
cellForRowAt, έλεγχα αν η εικόνα ήταν στην cache· αν ναι, την εμφάνιζα άμεσα. - Αν η εικόνα δεν ήταν στην cache, ξεκινούσα μια ασύγχρονη φόρτωση μέσω URLSession, και μετά τη φόρτωση, αποθήκευα την εικόνα στην cache και ενημέρωνα το κελί.
Παράδειγμα κώδικα:
let imageCache = NSCache<NSString, UIImage>()
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
let urlString = imageURLs[indexPath.row]
if let cachedImage = imageCache.object(forKey: urlString as NSString) {
cell.imageView?.image = cachedImage
} else {
cell.imageView?.image = nil
DispatchQueue.global().async {
if let url = URL(string: urlString),
let data = try? Data(contentsOf: url),
let image = UIImage(data: data) {
self.imageCache.setObject(image, forKey: urlString as NSString)
DispatchQueue.main.async {
if let updateCell = tableView.cellForRow(at: indexPath) {
updateCell.imageView?.image = image
updateCell.setNeedsLayout()
}
}
}
}
}
return cell
}
Αυτό μείωσε σημαντικά το φορτίο στο δίκτυο και βελτίωσε την ομαλή κύλιση.