我创建了一个小应用程序,用户可以将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)
}
}
这是我在数据库中的结构图像
如果有人可以解释为什么按字母顺序显示它们会很棒。
答案 0 :(得分:0)
所以我不确定你想要获取数据的顺序,但就像我在评论中说的那样,问题在于你的查询。您需要查看toLast
和toFirst
即可here。
如果您希望帖子从最近上传的内容(从最新到最旧)显示,请使用toLast
。 toFirst
提供相反的功能。查询看起来像这样:
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 here和here分页的好博文。
如果您想要检索所有帖子(不太可能),那么您可以使用startAt
或endAt
source,但您需要知道开始或结束的关键字。
Firebase不保证按顺序返回信息。这就是为什么你需要正确查询并循环返回以正确顺序返回的快照,以保持你的帖子按时间排序。
您还可以为每个帖子look at this question for help添加时间戳。然后按时间戳对数据数组进行排序。但是,我认为正确查询更有意义。