使用 Swift 4 语言同步 Firebase 的数据库

Posted

技术标签:

【中文标题】使用 Swift 4 语言同步 Firebase 的数据库【英文标题】:Synchronize database of Firebase with Swift 4 language 【发布时间】:2017-11-13 17:56:13 【问题描述】:

我是 swift 4 编程的新手。我尝试从 firebase 数据库中显示一些数据(实际上它们是子名称)。当视图确实加载时,我可以将它们显示在 tableView 上,但它不能实时工作。当我从 firebase 中删除一些数据时,我需要刷新(返回并再次加载)viewController。如果我用计时器刷新 tableView,所有数据都会从其末尾追加。如果我首先在将新数据附加到 tableView 后删除。它在抖动。无论如何要将此tableView与firebase同步,而不会出现这些问题?

override func viewDidLoad() 
        super.viewDidLoad()

        ref = Database.database().reference()
        ref.keepSynced(true)

        let userRef = self.ref.child("Users").child(Username).child("Schedule")
        userRef.observeSingleEvent(of: .value, with:  snapshot in
            for child in snapshot.children 
                let snap = child as! DataSnapshot
                let key = snap.key
                self.myList.append(key)
                self.CourseList.append(key)
                self.LessonsTableView.reloadData()
            
            // Lessons are taking and after, they are locating under phone's memory!
            UserDefaults.standard.set(self.CourseList, forKey: "LessonsArray")
            UserDefaults.standard.synchronize()
        )


//Setting up our table
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return myList.count
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = LessonsTableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! LessonsTableViewCell
        cell.myLabell.text = myList[indexPath.row]
        return cell
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
        let Dummy:String = myList[indexPath.row] as Any as! String
        let Selected:String = (Dummy as NSString) as Any as! String
        UserDefaults.standard.set(Selected, forKey: "Selected")
        self.performSegue(withIdentifier: "NextPage", sender: self)
    

【问题讨论】:

【参考方案1】:

Firebase 的任务是通常在后台(较低优先级)线程上运行的网络任务。但是 tableView.reloadData() 是一个 UI 任务。所以你可能需要通过下面的代码来执行UI相关的代码。

DispatchQueue.main.sync 
            let snap = child as! DataSnapshot
            let key = snap.key
            self.myList.append(key)
            self.CourseList.append(key)
            self.LessonsTableView.reloadData()

【讨论】:

为简单起见,您可以使用 DispatchQueue.main.sync 覆盖从“for child in snapshot.children ”行到“UserDefaults.standard.synchronize( )”。另一方面,只需在 UI 线程中执行整个 firebase 观察者回调。 我不能在这里写代码。请看我在这里的上一篇文章。【参考方案2】:

它给出了这样的错误,

    let userRef = self.ref.child("Users").child(Username).child("Schedule")
    userRef.observeSingleEvent(of: .value, with:  snapshot in
        DispatchQueue.main.sync 
            let snap = child as! DataSnapshot
            let key = snap.key
            self.myList.append(key)
            self.CourseList.append(key)
            self.LessonsTableView.reloadData()
        
        UserDefaults.standard.set(self.CourseList, forKey: "LessonsArray")
        UserDefaults.standard.synchronize()
    )

【讨论】:

以上是关于使用 Swift 4 语言同步 Firebase 的数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 iOS(swift)将 Firebase Auth 与 MySQL DB 同步?

Firebase 离线支持:在用户离线时上传帖子,当用户在 iOS Swift 应用程序中在线时同步

Xcode 11.4 Objective-C 语言的快速帮助,而不是 swift 语言,用于带有 Cocoapods 的 firebase API(iOS 13.4 应用程序)

Swift 4:Firebase 时间戳

使用firebase问题推送通知(ios,swift 4)[关闭]

Swift Firebase 加载记录延迟很长