在 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 是异步的。数据将在可用时提供,因此最好根据每个项目的创建时间戳对数组进行排序。
我是编程新手,目前正在尝试制作类似应用程序的新闻源。我的目标是通过我的应用程序和 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 是异步的。数据将在可用时提供,因此最好根据每个项目的创建时间戳对数组进行排序。