Swift Firebase замечает, что .childAdded реагирует на существующие элементы, а не на новые - PullRequest
0 голосов
/ 16 июня 2020

У меня есть ссылка, и я хочу только слушать, когда добавляются новые элементы (это viewWillAppear ниже). Когда добавляется новый элемент, появляется newItemsButton. Если ничего нового не добавлено к тому, что уже существует внутри базы данных, кнопка не должна появиться.

Проблема в том, что как только наблюдатель начинает наблюдать, появляется newItemButton, даже если ничего нового не было добавлено. Что я делаю не так?

db:

-posts
   -postId_1
   -postId_2
   -postId_3

код:

var startKey: String?
let postsRef = Database.database().reference().child("posts")
let postsObserverRef = Database.database().reference().child("posts")

override func viewDidLoad() {
    super.viewDidLoad()

    paginate()
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    listenForNewItems()
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    postsObserverRef.removeAllObservers()
}

func listenForNewItems() {

    postsObserverRef.observe(.childAdded) { (snapshot) in

        let postId = snapshot.key
        let isContained = self.dataSource.contains { $0.postId == postId }

        if !isContained {

            // show newItemsButton
        }
    }
}

func paginate() {

    if startKey == nil {

        postsRef.queryOrderedByKey().queryLimited(toLast: 20)
            .observeSingleEvent(of: .value, with: { (snapshot) in
            // fill datasource
        })

    } else {

        postsRef.queryOrderedByKey().queryEnding(atValue: startKey).queryLimited(toLast: 21)
            .observeSingleEvent(of: .value, with: { (snapshot) in
            // fill datasource
        })
    }
}
...