Pagination not working in Swift with Firebase

Viewed 24

I am trying to paginate my data pull. But somehow it is not working and I am not sure what I am doing wrong. In my viewDidLoad I call this function:

var currentKey: String?

func fetchNotifications() {
    guard let currentUid = Auth.auth().currentUser?.uid else { return }
            
    if currentKey == nil {

        //initial data pull
        NOTIFICATIONS_REF.child(currentUid).queryLimited(toLast: 16).observeSingleEvent(of: .value) { (snapshot) in
            
            guard let first = snapshot.children.allObjects.first as? DataSnapshot else { return }
            guard let allObjects = snapshot.children.allObjects as? [DataSnapshot] else { return }
            
            allObjects.forEach({ (snapshot) in
                let notificationId = snapshot.key
                guard let dictionary = snapshot.value as? Dictionary<String, AnyObject> else { return }
                guard let uid = dictionary["uid"] as? String else { return }
                
                Database.fetchUser(with: uid, completion: { (user) in
                    
                    // if notification is for post
                    if let postId = dictionary["postId"] as? String {
                        Database.fetchPost(with: postId, completion: { (post) in
                            let notification = Notification(user: user, post: post, dictionary: dictionary)
                            if notification.notificationType == .Comment {
                                self.getCommentData(forNotification: notification)
                            }
                            self.notifications.append(notification)
                            self.notifications.sort { (notification1, notification2) in
                                return notification1.creationDate > notification2.creationDate
                            }
                            self.tableView.reloadData()
                   
                        })
                    } else {
                        let notification = Notification(user: user, dictionary: dictionary)
                        self.notifications.append(notification)
                        
                        self.notifications.sort { (notification1, notification2) in
                            return notification1.creationDate > notification2.creationDate
                        }
                        self.tableView.reloadData()
                        
                        self.tableView.refreshControl?.endRefreshing()
                        
                    }
                })

            })
            self.tableView.refreshControl?.endRefreshing()
        }
        
    } else {
        
        NOTIFICATIONS_REF.child(currentUid).queryOrderedByKey().queryEnding(atValue: self.currentKey).queryLimited(toLast: 3).observeSingleEvent(of: .value) { (snapshot) in
            
            guard let first = snapshot.children.allObjects.first as? DataSnapshot else { return }
            guard let allObjects = snapshot.children.allObjects as? [DataSnapshot] else { return }

            allObjects.forEach({ (snapshot) in
                let notificationId = snapshot.key
                guard let dictionary = snapshot.value as? Dictionary<String, AnyObject> else { return }
                guard let uid = dictionary["uid"] as? String else { return }
                
                Database.fetchUser(with: uid, completion: { (user) in
                    
                    if notificationId != self.currentKey {
                        // if notification is for post
                        if let postId = dictionary["postId"] as? String {
                            Database.fetchPost(with: postId, completion: { (post) in
                                let notification = Notification(user: user, post: post, dictionary: dictionary)
                                if notification.notificationType == .Comment {
                                    self.getCommentData(forNotification: notification)
                                }
                                self.notifications.append(notification)
                                self.notifications.sort { (notification1, notification2) in
                                    return notification1.creationDate > notification2.creationDate
                                }
                                self.tableView.reloadData()
                              
                            })
                        } else {
                            let notification = Notification(user: user, dictionary: dictionary)
                            self.notifications.append(notification)
                            
                            self.notifications.sort { (notification1, notification2) in
                                return notification1.creationDate > notification2.creationDate
                            }
                            self.tableView.reloadData()
                            
                            self.tableView.refreshControl?.endRefreshing()
                            
                        }
                    }
                })
     
            })
            
        }
        
    }
    
}

I am populating the currentKey so it is no longer nil. The idea is that the else-statement then comes into place. But the else-statement is not being called .. I was also printing the currentKey after the initial data pull, so I know it is being populated, but still the else does not come into action.

0 Answers
Related