Sobes.tech
Junior — Middle

Ar galite pasidalinti techninio patobulinimo pavyzdžiu, padarytu projekte, ir aprašyti jo įgyvendinimą?

sobes.tech AI

Atsakymas iš AI

Viename iš mano iOS projektų pagerinau vaizdų įkėlimo našumą sąraše (UITableView), įgyvendindamas talpyklą ir asinchroninį įkėlimą.

Įgyvendinimas:

  • Naudojau NSCache jau įkeltų vaizdų saugojimui, kad išvengčiau jų pakartotinio įkėlimo iš tinklo.
  • cellForRowAt metode tikrinau, ar vaizdas yra talpykloje; jei taip, jį iškart rodžiau.
  • Jei vaizdas nebuvo talpykloje, pradėjau asinchroninį įkėlimą per URLSession, po įkėlimo išsaugodavau vaizdą talpykloje ir atnaujindavau langelį.

Kodo pavyzdys:

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
}

Tai žymiai sumažino tinklo apkrovą ir pagerino slinkimo sklandumą.