Перезагрузить TableView только в новых добавленных ячейках

У меня есть функция scrollToBottom, которая уведомляет приложение о том, когда следует начинать BatchFetches для содержимого, изображений и проверок.

   //1: User Scrolls all the way down calls beginBatchFetch()
   func scrollViewDidScroll(_ scrollView: UIScrollView) {
         let offsetY = scrollView.contentOffset.y
         let contentHeight = scrollView.contentSize.height
         print("offsetY: \(offsetY)")
         if offsetY > contentHeight - scrollView.frame.height {
            if self.viewSelected == "Content" {
                if !contentFetchMore {
                    beginContentBatchFetch()
                }
            } else if self.viewSelected == "Pics" {
                    if !picFetchMore {
                        beginPicBatchFetch()
                    }
            } else if self.viewSelected == "Checks" {
                        if !checksFetchMore {
                            beginChecksBatchFetch()
                        }
                    }
            }

     }

Это beginBatchFetchMethods. Self.reload в настоящее время перезагружает весь Tableview:

 func beginContentBatchFetch() {
    contentFetchMore = true
    ProgressHUD.show()
    DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
        self.checkQueryContinous()

        ProgressHUD.dismiss()
    }

}




func beginPicBatchFetch() {
     picFetchMore = true
           ProgressHUD.show()
           DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
            self.PicContinous()
            self.Reload()
            ProgressHUD.dismiss()
           }

}

func beginChecksBatchFetch() {
    checksFetchMore = true
           ProgressHUD.show()
           DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
            self.checkQueryContinous()
            self.Reload()
            ProgressHUD.dismiss()
           }

}

Вместо перезагрузки всего TableView. Я хотел бы перезагрузить только новые добавленные ячейки. Например, если бы у меня было 10 ячеек до пакетной выборки, а затем 20 ячеек после пакетной выборки, я бы хотел перезагрузить табличное представление только для этих ячеек 11-20.

Я поискал в Интернете, и StackOverFlow привел меня к этому: Ошибка компиляции iOS Swift и reloadRowsAtIndexPaths

      var _currentIndexPath:NSIndexPath?
      if let indexPath = _currentIndexPath {
     self.tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: 
     UITableViewRowAnimation.None)
      }
      else {
 `    //_currentIndexPath` is nil.
      // Error handling if needed.
    }

Это, насколько я понимаю, перезагружает только отображаемые ячейки. Однако мои пакетные выборки могут не возвращать больше значений. В результате в моем табличном представлении будут отображаться те же ячейки, что и до пакетной выборки, и это перезагрузит эти ячейки. Поскольку эти ячейки были ранее загружены, я не хочу тратить зря данные / испортить представление таблицы.

Что мне делать, спасибо?

2 ответа

Что вам нужно сделать, так это вычислить строки, которые необходимо перезагрузить, и убедиться, что вы передали эти indexPath в функцию перезагрузки строк после обновления источника данных новыми данными.

 private func calculateIndexPathsToReload(from newItems: [Items]) -> [IndexPath] {
    let startIndex = results!.count - newItems.count
    let endIndex = startIndex + newItems.count
    return (startIndex..<endIndex).map { IndexPath(row: $0, section: 0) }
}

Вот что я добавил к: https://www.youtube.com/watch?v=whbyVPFFh4M

Возможно, я напортачил с функцией цикла for. Я еще не очень разбираюсь в картировании.

func beginContentBatchFetch() {
    contentFetchMore = true
    ProgressHUD.show()
    let oldcount = contentObjectIdArray.count
    var IndexPathsToReload = [IndexPath]()
    var startIndex = Int()
    var endIndex = Int()
    DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
        self.checkQueryContinous()
        let newElements = self.contentObjectIdArray.count - oldcount
        startIndex = self.contentObjectIdArray.count - newElements
        endIndex = self.contentObjectIdArray.count
        for index  in startIndex..<endIndex {
            let indexPath = IndexPath(row: index, section: 0)
            IndexPathsToReload.append(indexPath)
        }
        if newElements > 0 {
        self.BarSelectedTableView.reloadRows(at: IndexPathsToReload, with: .fade)
    }
        ProgressHUD.dismiss()
    }

}
Другие вопросы по тегам