Как увеличить значение количества параметров JSON для разбиения на страницы в swift

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