#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
}