运行太频繁时代码崩溃。 Firebase / Swift

时间:2017-01-26 13:02:31

标签: ios swift firebase firebase-realtime-database

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时,我不会发生此类崩溃?

谢谢!

0 个答案:

没有答案