Wayne Filkins
Wayne Filkins

Reputation: 524

Memory leak while reloading the collectionView : Firebase

I'm trying to fill the collectionView with posts. I have to get the posts, then get some data for the users who posted them. For some reason it isn't working.

DataService.ds.REF_POSTS.child("\(self.loggedInUser!.uid)").queryLimitedToLast(30).observeSingleEventOfType(.Value, withBlock: { postDictionary in
            if postDictionary.exists() {
                if let snapshots = postDictionary.children.allObjects as? [FIRDataSnapshot] {
                    self.posts = [Post]()
                    for snap in snapshots {
                        if let postDict = snap.value as? NSDictionary {
                            for(name, value) in postDict {
                                let interval = postDict.objectForKey("timePosted") as! Double
                                let formattedDate = NSDate(timeIntervalSince1970: interval)
                                let timeAgo = self.getDate(formattedDate)
                                if name as! String == "postedBy" {
                                    DataService.ds.REF_USERS.child(value as! String).observeSingleEventOfType(.Value, withBlock: { (userDictionary) in
                                        let userDict = userDictionary.value as! NSDictionary
                                        let username = userDict.objectForKey("username")!
                                        let profileThumbUrl = userDict.objectForKey("profileThumbUrl")!
                                        let key = snap.key
                                        let post = Post(postKey: key, dictionary: postDict, username: username as! String, profileThumbUrl: profileThumbUrl as! String, timeAgo: timeAgo)
                                        self.posts.append(post)
                                    })
                                }
                            }
                        }
                    }
                }
            }
            self.collectionView?.reloadData()
        })

It works if I perform the reload() right after appending the posts, but there is some sort of memory leak. There isn't a problem in the Post class or filling the collection view, if I use dummy values. The problem is in this code that I posted. I think I have an extra loop or something can anyone help?

Upvotes: 0

Views: 421

Answers (1)

Dravidian
Dravidian

Reputation: 9945

If you fear that reload() is the reason of the memory leak , you can use this hack:-

 if name as! String == "postedBy" {
                                DataService.ds.REF_USERS.child(value as! String).observeSingleEventOfType(.Value, withBlock: { (userDictionary) in
                                    let userDict = userDictionary.value as! NSDictionary
                                    let username = userDict.objectForKey("username")!
                                    let profileThumbUrl = userDict.objectForKey("profileThumbUrl")!
                                    let key = snap.key
                                    let post = Post(postKey: key, dictionary: postDict, username: username as! String, profileThumbUrl: profileThumbUrl as! String, timeAgo: timeAgo)
                                    self.posts.append(post)

                                if posts.count == postDictionary.childrenCount{

                                 self.collectionView?.reloadData()

                                    } 
                                })
                            }

Then also see this answer :- Firebase observeSingleEventOfType stays in memory

Upvotes: 2

Related Questions