从Firebase swift 4

时间:2017-11-20 21:31:07

标签: ios uitableview firebase firebase-realtime-database swift4

我创建了一个小应用程序,用户可以将post上传到firebase数据库,然后在表格视图中,显示所有用户的内容,就像Instagram一样。我遇到了一个小问题:用户posts按字母顺序显示,而不是按posts开头显示最新上传的tableview的顺序显示。

这是我的代码,我从firebase下载数据并在tableView中查看。有没有人看到什么是错的,或者为什么帖子按字母顺序显示?

import UIKit
import FirebaseStorage
import FirebaseDatabase
import FirebaseAuth
import FirebaseCore
import Firebase

class MainViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

@IBOutlet weak var postsTableView: UITableView!

var posts = NSMutableArray()

override func viewDidLoad() {
    super.viewDidLoad()

    loadData()

    self.postsTableView.delegate = self
    self.postsTableView.dataSource = self

    // Uncomment the following line to preserve selection between presentations
    // self.clearsSelectionOnViewWillAppear = false

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


func loadData() {
    Database.database().reference().child("posts").observeSingleEvent(of: .value) { (snapshot) in
        if let postsDictionary = snapshot.value as? [String: AnyObject] {
        for post in postsDictionary {
            self.posts.add(post.value)

            }
            self.postsTableView.reloadData()
        }
    }
}

// MARK: - Table view data source

 func numberOfSections(in tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}

 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return self.posts.count
}


 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! PostTableViewCell
    // Configure the cell...
    let post = self.posts[indexPath.row] as! [String: AnyObject]
    cell.titleLabel.text = post["title"] as? String
    cell.contentTextView.text = post["content"] as? String

        if let imageName = post["image"] as? String {

            let imageRef = Storage.storage().reference().child("images/\(imageName)")
            imageRef.getData(maxSize: 25 * 1024 * 1024) { (data, error) -> Void in
                if error == nil {
                    //successfull
                    let downloadedImage = UIImage(data: data!)
                    cell.postsImageView.image = downloadedImage
                }else {
                    // error

                    print("there was an error downloading image: \(String(describing: error?.localizedDescription))")
            }
        }
    }

            return cell
        }


func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 400.0
}

@IBAction func logOutButton(_ sender: Any) {
    do {
    try Auth.auth().signOut()

        let registerSuccess = self.storyboard?.instantiateViewController(withIdentifier: "SignInVC")
        self.present(registerSuccess!, animated: true, completion: nil)
    }catch {

        let logInAlert = UIAlertController(title: "Ops something went wrong", message: "try again", preferredStyle: .alert)
        logInAlert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
        self.present(logInAlert, animated: true, completion: nil)

    }
    let registerSuccess = self.storyboard?.instantiateViewController(withIdentifier: "SignInVC")
    self.present(registerSuccess!, animated: true, completion: nil)
}

}

这是我在数据库中的结构图像

enter image description here

如果有人可以解释为什么按字母顺序显示它们会很棒。

1 个答案:

答案 0 :(得分:0)

所以我不确定你想要获取数据的顺序,但就像我在评论中说的那样,问题在于你的查询。您需要查看toLasttoFirst即可here

如果您希望帖子从最近上传的内容(从最新到最旧)显示,请使用toLasttoFirst提供相反的功能。查询看起来像这样:

func loadData() {
    Database.database().reference().child("posts").queryLimited(toLast: 7).observeSingleEvent(of: .value) { (snapshot) in
        for child in snapshot.children {
            let child = child as? DataSnapshot
            self.posts.add(child.value)
            self.postsTableView.reloadData()
        }
    }
}

func loadData() {
    Database.database().reference().child("posts").queryLimited(toFirst: 7).observeSingleEvent(of: .value) { (snapshot) in
        for child in snapshot.children {
            let child = child as? DataSnapshot
            self.posts.add(child.value)
            self.postsTableView.reloadData()
        }
    }
}

如果您在自己的应用中使用此功能,则需要分页。您可以找到一些关于Firebase herehere分页的好博文。

如果您想要检索所有帖子(不太可能),那么您可以使用startAtendAt source,但您需要知道开始或结束的关键字。

Firebase不保证按顺序返回信息。这就是为什么你需要正确查询并循环返回以正确顺序返回的快照,以保持你的帖子按时间排序。

您还可以为每个帖子look at this question for help添加时间戳。然后按时间戳对数据数组进行排序。但是,我认为正确查询更有意义。