在 UITableView 数组中保存 Firebase 结构 [Swift 4]

Save Firebase structure in UITableView Array [Swift 4]

我是编程新手,目前正在尝试制作类似应用程序的新闻源。我的目标是通过我的应用程序和 table 视图中的新 post 通知 firebase 数据库中的更改。目前我可以在 table 视图中显示一个 post。它只会在您重新打开 ViewController 时发生变化。 我的问题之一是我不知道如何使用任何其他命令然后使用 obserSingleEvent,我很确定这是我的主要错误之一。 所以我的问题是: 1. 如何让 tableView 在发生变化时立即重新加载? 2. 如何显示多于一个post? (3. 如何先显示最近的 post?)

class ViewController: BaseViewController, UITableViewDelegate, UITableViewDataSource {

@IBOutlet var newsfeedTableView: UITableView!

var ref: DatabaseReference!

var posts = [String]()

override func viewDidLoad() {
    super.viewDidLoad()
    addSlideMenuButton()

    ref = Database.database().reference()

    ref.child("posts").queryOrderedByKey().observeSingleEvent(of: .childAdded, with: { snapshot in

        let newPost = snapshot.value as? String
        self.posts.append(newPost!)
        print("newPost: \(newPost)")
        print("posts: \(self.posts)")
        self.newsfeedTableView.reloadData()
        print("reloadData")
    })

}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return (posts.count)
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = UITableViewCell(style: UITableViewCell.CellStyle.default, reuseIdentifier: "cell")

    cell.textLabel?.text = posts[indexPath.row]
    print("posts in cell: \(posts)")

    return cell
}
}

您正在观察 singleEvent,这对于预期用途是错误的。

ref.child("posts").observe( .childAdded, with: { snapshot in

    let newPost = snapshot.value as? NSDictionary
    let post_title:String = newPost!["post_title"] as? String ?? "error"
    self.posts.append(post_title)

    print("newPost: \(newPost)")
    print("posts: \(self.posts)")
    self.newsfeedTableView.reloadData()
    print("reloadData")
})

此外,该排序系统不适用于新闻应用。你不能使用人类提供的 1,2,3。从现在开始你能把它更新成这样吗:

(1 - 2) 随机生成的唯一的 post ID

PS。 Firebase 不可能用 post、post1、post2 对您的 post 列表进行排序。所以在这种情况下 queryOrderedByKey() 是没有用的。

使 posts 1,2,3 将适用于订购系统

1) 你可以实现一个函数,不断观察Firebase中的数据变化,更新数组。但要小心,它会消耗内存,而且你会得到大量的网络使用。

.observe // instead of .observeSingleEvent will do that

同样,如果您向 tableView 添加一个刷新器,这样您就可以按需获取数据,而不是一直获取数据,那就更好了。

2) 你的数组没问题。我会将对 firebase 的调用移动到另一个函数,而不是将其放在 viewDidLoad() 中。

3) 您需要在 firebase 中存储时间戳才能获得此功能。是的,您可以 queryOrdered 但请记住 firebase 是异步的。数据将在可用时提供,因此最好根据每个项目的创建时间戳对数组进行排序。