Swift Firebase:使用.child添加UIRefreshControl
问题描述:
好的,如果这可能是一个非常基本的问题,请原谅我,但是如何刷新我的tableView并只添加新项目到Firebase?Swift Firebase:使用.child添加UIRefreshControl
我正在尝试为我的tableView实现'pull to refresh'并使用已添加到Firebase的新项目填充我的tableView。在viewDidLoad中,我调用.observeSingleEvent(.value)来显示表格。
在刷新函数中,我调用.observe(.childAdded)。但是这样做会使应用程序始终监听添加的内容,使我的应用程序始终能够重新加载数据。我如何编写代码才能在刷新时刷新?到目前为止我的代码:
lazy var refresh: UIRefreshControl = {
let refresh = UIRefreshControl(frame: CGRect(x: 50, y: 100, width: 20, height: 20))
refresh.addTarget(self, action: #selector(refreshData), for: .valueChanged)
return refresh
}()
var eventsArray: [FIRDataSnapshot]! = []
override func viewDidLoad() {
super.viewDidLoad()
ref = FIRDatabase.database().reference()
ref.child("events").observeSingleEvent(of: .value, with: { (snapshot) in
for snap in snapshot.children {
self.eventsArray.insert(snap as! FIRDataSnapshot, at: 0)
}
DispatchQueue.main.async {
self.tableView.reloadData()
}
}) { (error) in
print(error.localizedDescription)
}
}
func refreshData() {
self.eventsArray = []
ref.child("events").observe(.childAdded, with: { (snapshot) in
print(snapshot)
self.eventsArray.insert(snapshot, at: 0)
DispatchQueue.main.async {
self.refresh.endRefreshing()
self.tableView.reloadData()
}
}) { (error) in
print(error.localizedDescription)
}
}
我也试图observeSingleEvent(.childAdded),但它只能翻出从火力地堡一个单一的入口(最顶端的条目)。
我不确定我的方法是否正确。任何建议在这里,谢谢。
答
添加
var lastKey: String? = nil
在您遍历孩子设置到的lastKey当前捕捉的关键循环。
lastKey = snap.key
让我知道这是否适合你。
func refreshData() {
// Make sure you write a check to make sure lastKey isn't nil
ref.child("events").orderByKey().startAt(lastKey).observeSingleEvent(of: .value, with: { (snapshot) in
// You'll have to get rid of the first childsince it'll be a duplicate, I'm sure you can figure that out.
for snap in snapshot.children {
self.eventsArray.insert(snap as! FIRDataSnapshot, at: 0)
}
DispatchQueue.main.async {
self.refresh.endRefreshing()
self.tableView.reloadData()
}
}) { (error) in
print(error.localizedDescription)
}
}
你好!是的,它的作品!谢谢。 – Koh
你好,尽管上述方法有效,但从长远来看可能无法持续。如果用户要删除事件,并且事实证明laskKey被删除,则会导致应用程序崩溃。有没有更好的方法来解决这个问题? – Koh
它会导致应用程序崩溃吗?我相当肯定它只是不返回任何结果,或者只是略过这个键,但我可能是错的。你测试过了吗? –