#json #swift #pagination #uicollectionview
Вопрос:
из бэкенда count start form 0. and 0,1,2,3...... . For each count 10 product is showing
Я изначально взял count = 0, как показано ниже
var currentCount: Int = 0
и добавил счетчик в JSON, как показано ниже в вызове службы: но здесь всегда отображается только 10 продуктов в collectionview… даже если есть еще продукты, то они также не отображаются.. почему?
fileprivate func serviceCall(){
self.currentCount =0
let param = ["jsonrpc": "2.0",
"params": ["type" : type, "count": currentCount]] as [String : Any]
APIReqeustManager.sharedInstance.serviceCall(param: param, vc: self, url: getUrl(of: .productByFeature), header: header) {(responseData) in
if self.currentCount > 0 {
self.viewmoreDB?.result?.products! = ViewMoreBase(dictionary: responseData.dict as NSDictionary? ?? NSDictionary())?.result?.products ?? [ViewMoreProducts]()
}
else{
self.viewmoreDB = ViewMoreBase(dictionary: responseData.dict as NSDictionary? ?? NSDictionary())
}
self.productsData = self.viewmoreDB?.result?.products
self.collectionView.reloadData()
}
}
и попытка использовать разбиение на страницы, как показано ниже, в конце индикатора активности collectionview отображается, но если есть больше продуктов, то также не загружается
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if scrollView == collectionView{
if (scrollView.contentOffset.y scrollView.frame.size.height) == scrollView.contentSize.height {
serviceCall()
}
}
}
пожалуйста, помогите
Ответ №1:
Это может быть любая из майских проблем. Одна из возможных причин заключается в том, что вы не обновляете currentCount
данные, когда получаете их, и ваше заявление if self.currentCount > 0
всегда завершается ошибкой, а else
часть выполняется, что означает, что данные не добавляются, а перезаписываются, и у вас снова есть только одна страница данных.
Если это правда, вы, вероятно, отсутствуете currentCount = self.productsData.count
или даже лучше, вы должны просто сделать так, чтобы ваше currentCount
свойство как вычисляемое выполняло
var currentCount: Int { productsData?.count ?? 0 }
Поскольку это предположение, более подходящий ответ заключается в том, что вам нужно улучшить свои навыки при отладке. Одной из широко используемых функций, доступных в большинстве современных IDE, является использование точек останова. В большинстве IDE вы просто нажимаете слева от строки, в которую хотите поместить точку останова, и там отображается значок. Когда ваш код выполняется с помощью отладчика, он остановится в точке останова, и вы сможете просмотреть всю информацию, которая в данный момент находится в стеке, и вы сможете выполнять построчно, чтобы увидеть, что происходит. Таким образом, в вашем случае вы могли бы разместить точку останова в первой строке после serviceCall
и посмотрите, по какому пути вас ведет код и почему.
При использовании Xcode есть еще одна функция, которую вы можете использовать, остановившись на точке останова. Вы можете использовать консоль в правом нижнем углу среды разработки для вывода значений в виде фрагментов кода. Поэтому, остановившись там, вы могли ввести «po self.CurrentCount» и увидеть количество. Более интересным было бы увидеть такие вещи, как «ViewMoreBase(словарь: responseData.dict как NSDictionary? ?? NSDictionary())?.результат?.продукты», чтобы проверить, получаете ли вы какие-либо продукты из бэкенда.
Комментарии:
1. на самом деле мое количество не увеличивается.. bcz
self.currentCount =0
я спросил у своего бэкенда, как увеличится количество2. они сказали
if you send count 0 , it will give you 1-10 product , if you send count 1 then 11-20 product like this.
3. то, что вы сказали в 1-м пераграфе, верно.. тогда как мне изменить свой код
4. @learn_swift Я вижу. Это обычно называется
page
. Так что в вашем случае вам нужно увеличить страницу, когда вы получите результат, верно? Так и сделайтеcurrentCount = 1
, когда получите ответ.5. @learn_swift также не забывайте о каком-то механизме блокировки, чтобы вы не вызывали BE для одних и тех же новых данных несколько раз. Метод
scrollViewDidScroll
будет вызываться много раз. Естьvar loadingInProgress: Bool = false
что-то подобное в вашем методе, где вы сначала проверяете загрузку данныхguard loadingInProgress == false else { return }
. А затем заблокируйте его, позвонивloadingInProgress = true
, и когда вы получите ответ, разблокируйте его, позвонивself.loadingInProgress = false
.