Добавление изображения из API в CustomCell программно затягивается - PullRequest
0 голосов
/ 15 января 2020

У меня при просмотре таблиц замедляется, у меня есть пользовательская ячейка и вид таблицы:

У меня есть этот контроллер, где выполняется вызов API и заполнен массив отключений, затем в cellForRow. При создании cell

class HistorialViewController: UIViewController , UITableViewDataSource, UITableViewDelegate  {
    @IBOutlet weak var historialTableView: UITableView!
    var trips = [RootClass]()
    override func viewDidLoad() {
        super.viewDidLoad()
        self.historialTableView.delegate = self
        self.historialTableView.dataSource = self

        self.historialTableView.register(CustomCellHistorial.self, forCellReuseIdentifier: cellId)
    }

    override func viewWillAppear(_ animated: Bool) {
       super.viewWillAppear(animated)
       print("coming back")
       self.fetchTrips()
    }

     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = self.historialTableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! CustomCellHistorial
        let trip = self.trips[indexPath.row]
        cell.trip = trip
        return cell
    }

    private func fetchTrips(){

        AFWrapper.getTripHistory( success: { (jsonResponse) in
            self.trips = []
            for item in jsonResponse["trips"].arrayValue {

                self.trips.append(RootClass(fromJson:item))
            }

            self.reloadTrips()
            Timer.scheduledTimer(withTimeInterval: 2.0, repeats: false) { (nil) in
                self.indicator.stopAnimating()
            }

        }, failure: { (error) -> Void in
            print(error)
        })
    }

    func reloadTrips(){
        DispatchQueue.main.async{
            self.historialTableView.reloadData()
        }
    }

Это моя CustomCell

class CustomCellHistorial : UITableViewCell{
    var trip: RootClass? {
        didSet{
            dateTimeLabel.text = returnCleanDate(fecha: trip!.createdAt)
            distanceAndTimeLabel.text = returnDistanceAndTime(distance: (trip?.trip!.real!.dist!)!, time: (trip?.trip!.real!.time)!)
            priceLabel.text = returnCleanPrice(price: (trip?.trip!.real!.price!)!)
            ratedLabel.text = "Not Rated"

            self.productImage.image = self.returnDriverImage(photoUrl: (self.trip?.driver!.photo!)!)
            if (trip!.score) != nil {

                let score = trip!.score
                if (score?.driver) != nil{
                    if(trip!.score!.driver!.stars! != 0.0 ){
                        ratedLabel.isHidden = true
                    }else{
                        ratedLabel.isHidden = false
                    }
                }else{
                    print("yei")
                }
            }
        }
    }

 private func returnDriverImage(photoUrl: String) -> UIImage{

        let url = URL(string: photoUrl)
        do {
            let data = try Data(contentsOf: url!)

                    if let roundedimg = UIImage(data: data){

                        let croppedImageDriver = roundedimg.resize(toTargetSize: self.productImage.frame.size)

                        return croppedImageDriver
                    }

        } catch let error {
            debugPrint("ERRor :: \(error)")
                let image = UIImage(named: "perfilIcono")
            return image!
        }
        let image = UIImage(named: "perfilIcono")
        return image!
    }

Ответы, которые я нашел, относятся к более старым версиям Swift, и способ, которым они делают просмотр таблицы в раскадровке, или они не обрабатываются пользовательские ячейки.

Я думаю, что проблема в функции returnDriverImage.

1 Ответ

1 голос
/ 15 января 2020

Эта строка

let data = try Data(contentsOf: url!)

Вы звоните с

self.productImage.image = self.returnDriverImage(photoUrl: (self.trip?.driver!.photo!)!)

, блокирует основной поток и повторно загружает одно и то же изображение несколько раз при прокрутке, пожалуйста, используйте SDWebImage

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...