使用 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 应用程序)