Быстрый значительный скачок в tableview всего одним запросом в cellforrow

#ios #swift #uitableview #realm #cell-formatting

#iOS #быстрый #uitableview #область #форматирование ячейки

Вопрос:

У меня есть следующий код в моем willDisplay:

 func tableView(_: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        guard case let cell as L_LocCell = cell else {
            return
        }

        let subC = subContractors[indexPath.row]
        cell.backgroundColor = .clear
        cell.locName = subC.companyname
        cell.locCode = subC.region

        /*if let sType = Helper_Types.getType(subC.type)
        {
            cell.add = sType.name
        }
        else {
            cell.add = ""
        }*/

        switch subC.status {
        case 3:
            cell.catColor = UIColor(rgba: Palette.class_bad)

            cell.catName = "Declined"
            break
        case 2:
            cell.catColor = UIColor(rgba: Palette.class_good)
            cell.catName = "Approved"
            break
        case 1:
            cell.catColor = UIColor(rgba: Palette.class_warn)
            cell.catName = "Pending"
            break
        case 4:
            cell.catColor = UIColor(rgba: Palette.ok)
            cell.catName = "Approved with Exception"
            break
        default:
            cell.catColor = companyMed
            cell.catName = "Unknown"
            break
        }

        if subConPicDir != nil {
            let filename = subConPicDir!.appendingPathComponent(subC.subcontractorId.description ".jpg")
            cell.thumbImg.kf.setImage(
                with: filename,
                placeholder: UIImage(named: "ic_supplier")!,
                options: [.transition(.fade(1)), .cacheOriginalImage],
                progressBlock: { receivedSize, totalSize in

            },
                completionHandler: { result in
                    print(result)

            })
        }
        else{
            cell.thumbImg.image = UIImage(named: "ic_supplier")
        }

    }
  

Существует значительная разница в плавности прокрутки, когда я возвращаю закомментированную часть.

Это всего лишь запрос для получения некоторой информации, которой у меня не было непосредственно в источнике данных моего tableview. Как я могу это оптимизировать?

 public static func getType(_ tid: Int) -> Types?
    {
        do {
            var realm : Realm? = try Realm()
            let predicate = NSPredicate(format: "_id = %d", tid);
            let types = realm!.objects(STD_type.self).filter(predicate);
            realm = nil
            if types.count > 0
            {
                return Types(st : types.first!)
            } else {
                return nil;
            }
        } catch let error as NSError {
            print("error realm (error.localizedDescription)")
            return nil
        }
    }
  

Ответ №1:

Поиск в области обычно выполняется довольно быстро, но это все еще асинхронная задача, которая требует времени и может даже выполняться в другом потоке.

Вместо того, чтобы делать это каждый раз, когда вы пытаетесь отобразить ячейку, я бы посоветовал вам извлекать все типы (возможно, в viewDidLoad), а затем просто фильтровать cellForRow

Тогда вы можете просто сделать что-то вроде

 cell.add = types.first { $0.id == subC.type } ?? ""
  

Который не является aysnc и будет намного быстрее и отзывчивее

Если по какой-то причине вы не можете получить все типы, я бы, по крайней мере, кэшировал результаты по мере их получения.

Комментарии:

1. для кэширования я бы просто добавил свойство в ячейку с именем, скажем, subType: String? а затем в cellForRow: если cell.subType == nil { cell.add = types.first({ $0.id == subC.type })? .имя ?? «»; } else { cell.add = cell.type! }

2. если бы я хотел сделать оба, поскольку все еще есть небольшой скачок с выборкой всего в viewdidload и извлечением, как у вас в вашем ответе

3. Сколько существует типов, которые вы извлекаете? и что вы подразумеваете под обоими? вызов в viewDidLoad должен быть очень быстрым, и как только у вас будет список, медлительности больше не должно быть

4. Я имел в виду как одновременную загрузку, так и кэширование, чтобы cellforrow не приходилось фильтровать каждый раз. Но сейчас это почти идеально.

5. У меня аналогичная проблема с другим tableview для оборудования. где я бы загружал назначенный сотруднику в cellforrow, и у меня может быть до 10 000 сотрудников, поэтому я не смог бы загрузить их все в viewDidLoad, что бы вы предложили для этого? Даже при кэшировании у меня не будет переходов при начальной прокрутке?