бесконечная прокрутка / разбиение на страницы данных Firebase Xcode - PullRequest
0 голосов
/ 07 марта 2019

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

(что сократит расходы, верно?), Поскольку я не возвращаю все данные одновременновремя?) .

Это табличное представление должно быть в состоянии справиться с большим количеством потомков из 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()
            }
        }
    }
...