【问题标题】:Save Firebase structure in UITableView Array [Swift 4]在 UITableView 数组中保存 Firebase 结构 [Swift 4]
【发布时间】:2019-05-06 23:39:36
【问题描述】:

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

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
}
}

【问题讨论】:

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


    【解决方案1】:

    您正在使用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) 随机生成的帖子 ID

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

    将帖子设置为 1,2,3 将适用于排序系统

    【讨论】:

    • 有效!哇太棒了。谢谢你,伙计。
    • 我相信您会使用 Firebase 构建出色的应用,继续努力
    • @RomanH 按键排序很好,但您可能会发现它有点限制。使用 .childByAutoId 创建您的密钥是正确的,但您可能需要考虑在每个节点中添加一个名为 index 的子节点,它是一个 Int。将整数顺序存储在每个索引中,它将为您提供更大的灵活性。您甚至可以将 reverse_index 存储为负数以进行反向排序。
    【解决方案2】:

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

    .observe // instead of .observeSingleEvent will do that
    

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

    2) 你的数组很好。我会将对 firebase 的调用移至另一个函数,而不是将其放在 viewDidLoad() 中。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-04
      • 2020-09-28
      • 1970-01-01
      • 2018-03-11
      • 2022-01-20
      相关资源
      最近更新 更多