Я пытаюсь создать приложение для развлечения и хочу иметь представление всех форумов в виде таблицы.Я хочу минимизировать затраты при запуске этого проекта, и именно тогда я наткнулся на бесконечную прокрутку / разбиение на страницы данных
(что сократит расходы, верно?), Поскольку я не возвращаю все данные одновременновремя?) .
Это табличное представление должно быть в состоянии справиться с большим количеством потомков из firebase, и это лучший способ справиться с этим, используя нумерацию страниц / бесконечную прокрутку?
Я смотрел учебник по этому«Replicode», я пытался реализовать это, однако это не работает, и, кроме того, я не могу найти способ сделать эту работу.
У меня есть две ошибки (я думаю) прямо сейчас:
ОШИБКА 1:
В представлении таблицы это показываетправильное количество тем, однако в нем отображаются повторяющиеся строки одной и той же ячейки.
ОШИБКА 2: При попытке прокрутки табличного представления происходит сбой, ив консоли написано *** Terminating app due to uncaught exception 'InvalidQueryParameter', reason: 'You can only pass nil, NSString or NSNumber to queryEndingAtValue:'
Это весь соответствующий код для этой проблемы:
var topics = [nameTopics]()
var filteredTopics = [nameTopics]()
//infinite scrolling methods
var fetchingMore = false
var endReached = false
let leadingScreensForBatching:CGFloat = 3.0
override func viewDidLoad() {
super.viewDidLoad()
self.searchController = UISearchController(searchResultsController: nil)
searchController.dimsBackgroundDuringPresentation = false
definesPresentationContext = true
tableView.tableHeaderView = searchController.searchBar
self.tableView.delegate = self
self.tableView.dataSource = self
let postCell = UINib(nibName: "TopicsTableViewCell", bundle: nil)
self.tableView.register(postCell, forCellReuseIdentifier:
"topicCell")
beginBatchFetch()
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return topics.count
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
self.performSegue(withIdentifier: "goToTopic", sender: self.topics[indexPath.row])
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "topicCell", for: indexPath) as! TopicsTableViewCell
cell.topicName.text = self.topics[indexPath.row].name
cell.followersLabel.text = String (self.topics[indexPath.row].followersCount)
return cell
/*
let cell = tableView.dequeueReusableCell(withIdentifier: "loadingCell", for: indexPath) as! LoadingCell
cell.spinner.startAnimating()
return cell
*/
}
func scrollViewDidScroll(_ scrollView: UIScrollView) {
let offsetY = scrollView.contentOffset.y
let contentHeight = scrollView.contentSize.height
if offsetY > contentHeight - scrollView.frame.size.height * leadingScreensForBatching {
if !fetchingMore && !endReached {
beginBatchFetch()
}
}
}
/*
func numberOfSections(in tableView: UITableView) -> Int {
return 2
}
*/
func fetchTopics(completion:@escaping (_ topics:[nameTopics])->()) {
let postsRef = Database.database().reference().child("topics")
var queryRef:DatabaseQuery
let lastPost = topics.last
if lastPost != nil {
queryRef = postsRef.queryOrdered(byChild: "followersCount").queryEnding(atValue: lastPost).queryLimited(toLast: 20)
} else {
queryRef = postsRef.queryOrdered(byChild: "followersCount").queryLimited(toLast: 20)
}
queryRef.observeSingleEvent(of: .value, with: { snapshot in
//var tempPosts = [Post]()
for child in snapshot.children {
if let childSnapshot = child as? DataSnapshot,
let dict = childSnapshot.value as? [String:Any],
let topicHotness = dict["topicHotness"] as? Int,
//let text = dict["text"] as? String,
let followers = dict["followersCount"] as? Int {
if childSnapshot.key != lastPost?.name {
//let userProfile = UserProfile(uid: uid, username: username, photoURL: url)
let insertMe = nameTopics(name: snapshot.key, score: topicHotness, followersCount: followers)
self.topics.insert(insertMe, at: 0)
}
}
}
return completion(self.topics)
})
}
func beginBatchFetch() {
fetchingMore = true
//self.tableView.reloadSections(IndexSet(integer: 1), with: .fade)
fetchTopics { newPosts in
self.topics.append(contentsOf: newPosts)
self.fetchingMore = false
self.endReached = newPosts.count == 0
UIView.performWithoutAnimation {
self.tableView.reloadData()
}
}
}