func grabPosts2(){
posts = []
currentUserRef?.child("invitedToPosts").queryOrdered(byChild: "timestamp").queryStarting(atValue: cutoff).observeSingleEvent(of: .value, with: { (snapshot: FIRDataSnapshot) in
if let snapshots = snapshot.children.allObjects as? [FIRDataSnapshot] {
for snap in snapshots {
let postKey = snap.key
DataService.ds.REF_INITIATIONS.child(postKey).observeSingleEvent(of: .value, with: { (snapshot: FIRDataSnapshot) in
if let dict = snapshot.value as? Dictionary<String,Any>{
let post = Post(postKey: snapshot.key, postData: dict)
self.posts.append(post)
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
})
}
}
})
}
数据库示例:
User
invitedToPosts
09283094823904
timestamp: 30909000909
Initiations
09283094823904
post information
上面的代码正在进入用户的inviteToPosts,如果时间戳足够,抓住密钥并在Initiations中找到它,然后抓取帖子信息,制作一个post对象它,将它附加到我的posts数组,并每次重新加载我的tableview。
我在启动时运行此代码,然后我同时拥有一个按钮和一个运行此功能的刷新控制器。
如果我慢慢点击刷新按钮或拖动以慢慢刷新,我从未使用此代码崩溃。但是,如果我快速点击按钮,有时我可以点击它3次,有时我可以点击它20次,但最终代码崩溃了。
我在我的cellForRowAtIndexPath
中获取此行的索引超出范围 let post = posts[indexPath.row]
所以我认为它与清除post数组和尝试刷新页面有关,而另一个请求运行缓慢然后它赶上了,一切都变得疯狂。不过不知道。
如何安全地运行此代码或如何成功编写此代码的任何想法,以便当我的目标是使用最新信息刷新我的tableview时,我不会发生此类崩溃?
谢谢!