Как я могу заказать данные для отображения на iOS с помощью Firestore - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь упорядочить свои данные по TimeStamp, но, похоже, они не работают. Мой класс Feed ниже. Может кто-нибудь, пожалуйста, посмотрите и скажите мне, что происходит. Я считаю, что проблема в функции checkForUpdates (). Я перепробовал все, чтобы получить данные для заказа по метке времени. Когда я удаляю функцию loadData (), приложения отображали сообщения по порядку по отметке времени, но новое сообщение всегда go до конца просмотра. Feed not ordered by timnestamp

import UIKit import FirebaseFirestore

класс FeedV C: UITableViewController {

var db = Firestore.firestore()
var postArray = [Posts]()

override func viewDidLoad() {
    super.viewDidLoad()

    //db = Firestore.firestore()

// loadData () // checkForUpdates ()

}
   override func viewDidAppear(_ animated: Bool){
     checkForUpdates()
    loadData()



}

func loadData() {
    db.collection("posts").getDocuments() {
        querySnapshot, error in
        if let error = error {
            print("\(error.localizedDescription)")
        }else{
            self.postArray = querySnapshot!.documents.flatMap({Posts(dictionary: $0.data())})
            DispatchQueue.main.async {
                self.tableView.reloadData()
            }
        }
    }


}

func checkForUpdates() {
    db.collection("posts").order(by: "timeStamp", descending: true)
    .addSnapshotListener {
            querySnapshot, error in

            guard let snapshot = querySnapshot else {return}

            snapshot.documentChanges.forEach {
                diff in

                if diff.type == .added {
                    self.postArray.append(Posts(dictionary: diff.document.data())!)
                    DispatchQueue.main.async {
                        self.tableView.reloadData()
                    }
                }
            }

    }
}

@IBAction func composePost(_ sender: Any) {





    let composeAlert = UIAlertController(title: "New Post", message: "Enter your name and message", preferredStyle: .alert)

    composeAlert.addTextField { (textField:UITextField) in
        textField.placeholder = "Your name"
    }

    composeAlert.addTextField { (textField:UITextField) in
        textField.placeholder = "Your message"
    }

    composeAlert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))

    composeAlert.addAction(UIAlertAction(title: "Send", style: .default, handler: { (action:UIAlertAction) in do {


        if let name = composeAlert.textFields?.first?.text, let content = composeAlert.textFields?.last?.text {

            let newSweet = Posts(name: name, content: content, timeStamp: Timestamp())

            var ref:DocumentReference? = nil
            ref = self.db.collection("posts").addDocument(data: newSweet.dictionary) {
                error in

                if let error = error {
                    print("Error adding document: \(error.localizedDescription)")
                }else{
                    print("Document added with ID: \(ref!.documentID)")
                }

            }

        }
        }

    }))

    self.present(composeAlert, animated: true, completion: nil)


}



// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {

    return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return postArray.count
}


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)

    let post = postArray[indexPath.row]

    cell.textLabel?.text = "\(post.name): \(post.content)"
    cell.detailTextLabel?.text = "\(post.timeStamp.dateValue())"

    return cell
}

}

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

Вы можете просто присвоить false descending: false

    func checkForUpdates() {
    db.collection("posts").order(by: "timeStamp", descending: false)
    .addSnapshotListener {
      querySnapshot, error in

          guard let snapshot = querySnapshot else {return}

               snapshot.documentChanges.forEach {
                 diff in

                 if diff.type == .added {
                   self.postArray.append(Posts(dictionary: diff.document.data())!)
                     DispatchQueue.main.async {
                      self.tableView.reloadData()
                     }
                  }
               }

           }
        }

ИЛИ Вы можете просто обратить свой массив, как показано ниже

func checkForUpdates() {
    db.collection("posts").order(by: "timeStamp", descending: true)
    .addSnapshotListener {
        querySnapshot, error in

          guard let snapshot = querySnapshot else {return}

             snapshot.documentChanges.forEach {
              diff in

               if diff.type == .added {
                  self.postArray.append(Posts(dictionary: diff.document.data())!)
               }
               self.postArray.reversed()
               DispatchQueue.main.async {
                    self.tableView.reloadData()
                }
            }

          }
       }
0 голосов
/ 06 февраля 2020

порядок использования: при загрузке данных

chats.order(by: "createdTime", descending: false) 
...