Источник данных UITableViewController не читает новые значения - PullRequest
0 голосов
/ 11 марта 2019

У меня есть следующая модель, базовый класс UITableViewController и подкласс UITableViewController:

Модель

class Product {

    var title: String
    var prices: [Int]

}

UITableViewController - Суперкласс

class BaseTableController: UITableviewController {

    var items: [Product] = [Product]()

    override func viewDidLoad() {
        super.viewDidLoad()
        fetchData()
    }

    // MARK: - UITableViewDataSource

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return items.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath)
        let item = items[indexPath.item]
        Logger.debug("FOUND \(item.prices.count) PRICES")
        return cell
    }

    // MARK: - Data

    func fetchData() {
        let dispatchGroup = DispatchGroup()

        items.forEach { (item) in
            dispatchGroup.enter()
            APIService.shared.getPrices(product: item) { (prices) in
                item.prices = prices
                dispatchGroup.leave()
            }
        }

        dispatchGroup.notify(queue: DispatchQueue.main) {
            self.tableView.reloadData()
        }
    }

}

UITableViewController - Подкласс

class MyFancyTable: BaseTableController {

    override var items: [Product] {
        set {}
        get {
            return [
                Product(title: "FOOD"),
                Product(title: "DRINK")
            ]
        }
    }

}

Я буду использовать MyFancyTable для получения цен из другой категории продуктов.

КогдаAPI возвращает ответ, он обновит цены в переменной items, а затем перезагрузит таблицу.

Однако, когда я переопределяю items в подклассе (MyFancyTable), даже если цены былиобновленный во время обратного вызова API, регистратор (в cellForRowAtIndexPath) все еще читает нулевые цены.Как будто оно никогда не обновлялось.

Журнал результатов:

FOUND 0 PRICES - для еды

FOUND 0 PRICES - для питья

Я могу подтвердитьAPI возвращает несколько цен.

Любая помощь будет оценена.Спасибо!

Ответы [ 2 ]

1 голос
/ 11 марта 2019

Ваша проблема может быть причиной того, что вы установили переменную items в качестве вычисляемого свойства, это означает, что она пересчитывается при каждом вызове

, попробуйте это:

class MyFancyTable: BaseTableController {

     override var items: [Product] = [Product(title: "FOOD"),Product(title: "DRINK")]
}
0 голосов
/ 11 марта 2019

Я наконец-то придумал исправление (по рекомендации Тунг Ву Дука). По сути, мне нужно переопределить items внутри функции init в подклассе, вместо этого сделать это через свойство computed-свойство, как я это делал изначально.

Теперь подкласс выглядит следующим образом:

class MyFancyTable: BaseTableController {

    required init?(coder aDecoder: NSCoder) {
        fatalError()
    }

    init() {
        super.init(nibName: nil, bundle: nil)

        items = [
            Product(title: "FOOD"),
            Product(title: "DRINK")
        ]
    }

}

Спасибо всем!

...