Как я могу разбить на страницы, используя swift и firebase? - PullRequest
0 голосов
/ 26 июня 2018

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

Цель - извлекать сообщения в хронологическом порядке по дате. Последний должен прийти первым. Сообщения от людей, за которыми я следую. Извлечение 3 сначала, а затем еще 3 при прокрутке вниз.

Пример структуры базы данных реального времени Firebase.

Таблица пользователей

users
 -uid
  -name
  -emailID

стол сообщений

posts
 -uid
   -pid
    -title
    -date
   -pid2
    -title
    -date

Controller.swift

Я получаю все идентификаторы пользователя а потом я пытаюсь получить сообщения из этих UID

fileprivate func fetchPosts() {
    guard let uid = Auth.auth().currentUser?.uid else { return }

    Database.fetchUserWithUID(uid: uid) { (user) in

        self.fetchPostsWithUser(user: user)

    }
}

fileprivate func fetchPostsWithUser(user: User) {
    let uid = user.uid

    let ref = Database.database().reference().child("posts").child(uid)

    var query = ref.queryOrdered(byChild: "creationDate")

    if posts.count > 0 {
        let value = posts.last?.creationDate.timeIntervalSince1970
        query = query.queryEnding(atValue: value)
    }

    query.queryLimited(toLast: 3).observeSingleEvent(of: .value, with: { (snapshot) in

        guard var allObjects = snapshot.children.allObjects as? [DataSnapshot] else { return }

        allObjects.reverse()

        print("coint is , ", allObjects.count)
        if allObjects.count < 2 {
            self.isFinishedPaging = true
        } else {
            self.isFinishedPaging = false
        }
        if self.posts.count > 0 && allObjects.count > 0 {
            allObjects.removeFirst()
        }

        allObjects.forEach({ (snapshot) in
            guard let dictionary = snapshot.value as? [String: Any] else { return }
            var post = Post(user: user, dictionary: dictionary)

            post.id = snapshot.key

            self.posts.append(post)
        })


        self.collectionView?.reloadData()


    }) { (err) in
        print(err)
    }

}

расширение

extension Database {

    static func fetchUserWithUID(uid: String, completion: @escaping (User) -> ()) {
        Database.database().reference().child("users").child(uid).observeSingleEvent(of: .value, with: { (snapshot) in

            guard let userDictionary = snapshot.value as? [String: Any] else { return }

            let user = User(uid: uid, dictionary: userDictionary)
            completion(user)


        }) { (err) in
            print("Failed to fetch user for posts:", err)
        }
    }

Этот код работает, но странно. Я не получаю сообщения в правильном порядке. Это всегда дает мне вывод случайно заказанных постов.

Что мне делать?

Ответы [ 3 ]

0 голосов
/ 02 января 2019

Добавление следующих строк между self.posts.append и reloadData решит вашу проблему.

                self.posts.sort(by: { (p1, p2) -> Bool in
                    return p1.creationDate.compare(p2.creationDate) == .orderedDescending })
0 голосов
/ 02 января 2019

1). Получить первые 5 данных из базы данных Здесь моя таблица называется "Tweets"

    let FetchtweetRef = FIRDatabase.database().reference()
    FetchtweetRef.child("Tweets").queryOrderedByKey().queryLimited(toLast: 5).observe(FIRDataEventType.value, with: { (tweets) in

        for  tweet in tweets.children{
            let newTweet = Tweet(snaspshot: tweet as! FIRDataSnapshot)
            // Store object in Array
        }

        FetchtweetRef.child("Tweets").removeAllObservers()
    })

2). После получения следующих 5 данных о прокрутке таблицы.

    // Here find last object key from array.
    let key = self.tweetArray[self.tweetArray.count].key

    let FetchtweetRef = FIRDatabase.database().reference()
    FetchtweetRef.child("Tweets").queryOrderedByKey().queryEnding(atValue: key).queryLimited(toLast: 6).observe(.value, with: {(tweets) in

        for  tweet in tweets.children {
            let newTweet = Tweet(snaspshot: tweet as! FIRDataSnapshot)
           // Stored object in Array
        }
        FetchtweetRef.child("Tweets").removeAllObservers()
    })
0 голосов
/ 27 июня 2018

Причина, по которой вы получаете сообщения в случайном порядке, заключается в том, что observeSingleEvent(of: ) выбирает данные из базы данных в порядке поступления. Поэтому в пользовательском интерфейсе Firebase он может быть основан на алфавитном порядке создания, но это не значит, что он будет отображаться в представлении при получении. Вам нужно будет использовать queryOrderedByKey) или (queryOrderedByValue) и отсортировать их по ключу / значению (если вы создаете посты по childByAutoID, он автоматически будет от самого старого (сверху) до самого нового при создании.

...