Junior — Middle
Можеш ли да споделиш пример за техническо подобрение, въведено в проекта, и да опишеш неговата реализация?
sobes.tech AI
Отговор от AI
В един от моите iOS проекти подобрих производителността на зареждане на изображения в списъка (UITableView) чрез внедряване на кеширане и асинхронно зареждане.
Реализация:
- Използвах
NSCacheза съхраняване на вече заредените изображения, за да избегна повторното им зареждане от мрежата. - В метода
cellForRowAtпроверявах дали изображението е в кеша; ако е, го показвах веднага. - Ако изображението го нямаше, стартирах асинхронно зареждане чрез URLSession, след като заредих изображението, го запазвах в кеша и обновявах клетката.
Примерен код:
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
}
Това значително намали натоварването на мрежата и подобри плавността на скролването.