Разбивка на страницы с «ограничением отображения данных» на страницу с использованием UITableView

#ios #json #swift #uitableview #pagination

#iOS #json #swift #uitableview #разбивка на страницы

Вопрос:

У меня есть некоторые data исходящие из API , в следующей структуре:

 {
    "AssetType": "Watch",
    "checkDate": "2020-08-22",
    "totalCount": 31,
    "hasMore": true,
    "skip": 10,
    "items": [
        {
            "id": "150",
            "name": "Rolex",
            "includeExtraParts": 0,
            "package": "box",
            "unit": "g",
            "manufacture": null,
            "totalPrice": 1738.04310497
        },
       ... ..
    ]
}
 

Я проанализировал и отобразил данные в моем UITableView до сих пор, и я хочу получить больше данных, пока hasMore флаг есть true , и хочу отобразить data количество отсчетов 10 fetch в моем UITableView , пока hasMore флаг не станет false ..

Тем не менее, я могу fetch отображать только 10 подсчетов проанализированных данных внутри моего UITableView .. Как я могу правильно реализовать data pagination , чтобы достичь того, чего я пытаюсь достичь?

вот что я пробовал до сих пор, и оно НЕ работает должным образом и pagination ВООБЩЕ НЕ вызывает эффект:

Внутри viewDidLoad() :

  ApiCaller.getData(token: token, dataID: dataID, skip: skip, completion: { (response) in
    self.total = response.totalCount
    self.hasMore = response.hasMore
    self.skip = response.skip
    if self.skip < response.totalCount amp;amp; response.hasMore == true {
        self.data = response.items
        
    }  else {
        return
    }
    self.tableVIew.reloadData()
})

 

и моя func loadMore() логика:

   func loadMore() {
        if (self.hasMore == false) {
            return
        } else {
            DispatchQueue.main.asyncAfter(deadline: .now()   1) {
                //calls the Api caller func inside viewDidLoad()
                self.getData()
            }
            
        }
    }
 

и, наконец, внутри UITableViewDelegate я сделал / назвал это так:

 
    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        
        if (self.hasMore == false) || (self.data.count == 0) {
            return
        }
        
        if indexPath.row == self.data.count - 3 {
            loadMore()
        }        
    }
 

и это не работает. Кто-нибудь может помочь мне разобраться в этой логике, пожалуйста?

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

1. перезагрузите tableview в главном потоке пользовательского интерфейса

2. также не требуется -3, -1 в порядке.

3. вы загружаете больше функций, нужно просто проверить свойство hasmore вместо извлечения данных с сервера

Ответ №1:

Кажется, вы переопределяете свое свойство self.data каждый раз, когда получаете новые данные. Я предполагаю, что это свойство является массивом. Если это так, используйте метод .append(contentsOf:), чтобы добавить вновь извлеченные данные к уже извлеченным.

 if self.skip < response.totalCount amp;amp; response.hasMore == true {
   self.data = response.items // You are overriding your data each time here       
 }