firebase 数据库中新添加的数据在使用 Swift3 拉刷新之前自我复制
New added data in firebase database duplicate it self before pull to refresh using Swift3
为什么当我向 firebase 数据库添加新数据时在我的应用程序中出现重复,但是当我下拉以再次刷新它时没有重复,我放了一张关于数据如何出现在我的项目模拟器中的屏幕截图。这是数据在我的项目中的显示方式
这是我的代码。
import UIKit
import FirebaseDatabase
import SDWebImage
import FirebaseAuth
class ViewController: UIViewController , UITableViewDataSource , UITableViewDelegate {
@IBOutlet weak var tableView: UITableView!
var Ref:FIRDatabaseReference?
var Handle:FIRDatabaseHandle?
var myarray = [Posts]()
var refresh = UIRefreshControl()
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
refresh.addTarget(self, action: #selector(ViewController.loadData), for: .valueChanged)
tableView.addSubview(refresh)
}
override func viewDidAppear(_ animated: Bool) {
loadData()
}
func loadData(){
self.myarray.removeAll()
Ref=FIRDatabase.database().reference()
Handle = Ref?.child("Posts").queryOrdered(byChild: "Des").queryEqual(toValue: "11").observe(.childAdded ,with: { (snapshot) in
if let post = snapshot.value as? [String : AnyObject]{
let img = Posts()
img.setValuesForKeys(post)
self.myarray.append(img)
print("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\(img)")
self.tableView.reloadData()
}
})
self.refresh.endRefreshing()
}
似乎 self.refresh.endRefreshing() 在 Firebase 闭包之外被调用。
这很糟糕,因为该代码将 运行 在 Firebase returns 数据之前 returns 并重新加载 tableView 数据。
请记住,Firebase 是异步的,互联网需要时间将数据从 Firebase 服务器获取到您的应用程序,因此 in-line 代码通常会在闭包中的代码之前执行。
此外,在这种情况下不需要句柄,除非您在其他地方使用它。
Ref?.child("Posts").queryOrdered(byChild: "Des").queryEqual(toValue: "11")
.observe(.childAdded ,with: { (snapshot) in
if let post = snapshot.value as? [String : AnyObject]{
let img = Posts()
img.setValuesForKeys(post)
self.myarray.append(img)
print("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\(img)")
self.tableView.reloadData()
}
self.refresh.endRefreshing()
})
此外,您可以考虑完全删除刷新,因为当您将观察者添加到 Firebase 节点 (.childAdded) 时,只要它添加了一个子节点,您的 tableview 将由于闭包中执行的代码而自动刷新。
为什么当我向 firebase 数据库添加新数据时在我的应用程序中出现重复,但是当我下拉以再次刷新它时没有重复,我放了一张关于数据如何出现在我的项目模拟器中的屏幕截图。这是数据在我的项目中的显示方式
这是我的代码。
import UIKit
import FirebaseDatabase
import SDWebImage
import FirebaseAuth
class ViewController: UIViewController , UITableViewDataSource , UITableViewDelegate {
@IBOutlet weak var tableView: UITableView!
var Ref:FIRDatabaseReference?
var Handle:FIRDatabaseHandle?
var myarray = [Posts]()
var refresh = UIRefreshControl()
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
refresh.addTarget(self, action: #selector(ViewController.loadData), for: .valueChanged)
tableView.addSubview(refresh)
}
override func viewDidAppear(_ animated: Bool) {
loadData()
}
func loadData(){
self.myarray.removeAll()
Ref=FIRDatabase.database().reference()
Handle = Ref?.child("Posts").queryOrdered(byChild: "Des").queryEqual(toValue: "11").observe(.childAdded ,with: { (snapshot) in
if let post = snapshot.value as? [String : AnyObject]{
let img = Posts()
img.setValuesForKeys(post)
self.myarray.append(img)
print("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\(img)")
self.tableView.reloadData()
}
})
self.refresh.endRefreshing()
}
似乎 self.refresh.endRefreshing() 在 Firebase 闭包之外被调用。
这很糟糕,因为该代码将 运行 在 Firebase returns 数据之前 returns 并重新加载 tableView 数据。
请记住,Firebase 是异步的,互联网需要时间将数据从 Firebase 服务器获取到您的应用程序,因此 in-line 代码通常会在闭包中的代码之前执行。
此外,在这种情况下不需要句柄,除非您在其他地方使用它。
Ref?.child("Posts").queryOrdered(byChild: "Des").queryEqual(toValue: "11")
.observe(.childAdded ,with: { (snapshot) in
if let post = snapshot.value as? [String : AnyObject]{
let img = Posts()
img.setValuesForKeys(post)
self.myarray.append(img)
print("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\(img)")
self.tableView.reloadData()
}
self.refresh.endRefreshing()
})
此外,您可以考虑完全删除刷新,因为当您将观察者添加到 Firebase 节点 (.childAdded) 时,只要它添加了一个子节点,您的 tableview 将由于闭包中执行的代码而自动刷新。