Kam një pyetje pak të komplikuar për të shpjeguar, por do të përpiqem të jem sa më i qartë që të mundem...
Po marr të njëjtat vlera nga firebase. Konkretisht unë kam një klasë Post dhe një klasë përdoruesi. Pra, një pjesë e strukturës sime të firebase është kështu:
Në myPost i kam të gjitha postId-të e lidhura me përdoruesin. Kur ngarkohet pamja, unë marr të gjithë postID-in e lidhur me përdoruesin nga myPosts dhe prej tyre marr të gjithë postimin nga Postimet dhe më pas i shfaq në pamje.
Në detaje këtu është funksioni që përdor për të marrë postimet:
var FEED_REF = Database.database().reference().child("myPosts")
func observeFeed(withUserId id: String, kPagination: Int, loadMore: Bool, postCount: Int? = 0, completion: @escaping (Post, FirebaseUser) -> Void, isHiddenIndicator: @escaping (_ isHiddenIndicator: Bool?) -> Void, isEmpty: @escaping () -> Void) {
FEED_REF.observeSingleEvent(of: .value) { (snapshot) in
if !snapshot.hasChild(id) {
isEmpty()
return
}
}
let query = FEED_REF.child(id).queryOrdered(byChild: "timestamp").queryLimited(toLast: UInt(kPagination))
query.observeSingleEvent(of: .value, with: {
snapshot in
print("Got Snap in feed Observer")
var items = snapshot.children.allObjects
if loadMore {
if items.count <= postCount! {
isHiddenIndicator(true)
return
}
items.removeLast(postCount!)
}
let myGroup = DispatchGroup()
var results = Array(repeating: (Post(), FirebaseUser()), count: items.count)
for (index, item) in (items as! [DataSnapshot]).enumerated() {
myGroup.enter()
Api.Post.observePost(withId: item.key, completion: { (post) in
Api.User.observeUser(withId: post.uid, completion: { (user) in
results[index] = (post, user)
myGroup.leave()
})
})
}
myGroup.notify(queue: .main) {
for result in results {
completion(result.0, result.1)
}
}
})
}
Këtu është funksioni për të vëzhguar postimet:
let POSTS_REF = Database.database().reference().child("Posts")
func observePost(withId id: String, completion: @escaping (Post) -> Void) {
POSTS_REF.child(id).observeSingleEvent(of: .value, with: {
snapshot in
if let dict = snapshot.value as? [String: Any] {
let post = Post.getPost(dictionary: dict, key: snapshot.key)
completion(post)
}
})
}
Këtu është funksioni për të vëzhguar përdoruesit:
let USER_REF = Database.database().reference().child("Users")
func observeUser(withId uid: String, completion: @escaping(FirebaseUser) -> Void) {
USER_REF.child(uid).observeSingleEvent(of: .value) { (snapshot) in
if let dict = snapshot.value as? [String:Any] {
let user = FirebaseUser.getUser(dictionary: dict, key: snapshot.key)
completion(user)
}
}
}
Në pikëpamjen timeDidLoad unë e thërras këtë funksion për të përditësuar pamjen:
func loadPosts() {
activityIndicatorHome.startAnimating()
guard let currentUserId = Api.User.CURRENT_USER?.uid else {return}
Api.Feed.observeFeed(withUserId: currentUserId, kPagination: kPagination, loadMore: false, completion: { (post, user) in
print("1")
self.posts.insert(post, at: 0)
self.users.insert(user, at: 0)
self.tableView.reloadData()
self.refreshControl.endRefreshing()
self.activityIndicatorHome.stopAnimating()
}, isHiddenIndicator: { (bool) in
print("2")
}) {
print("3")
self.activityIndicatorHome.stopAnimating()
self.emptyTableViewDefaultText()
self.tableView.reloadData()
self.refreshControl.endRefreshing()
}
Çdo gjë funksionon mirë nëse nuk ka ndryshime. Ajo që po përpiqem të bëj tani është të vëzhgoj ndryshimet. Do të thotë nëse përdoruesi shton ose heq një postim, unë do të doja të thërrisja loadPosts() dhe të përditësoja pamjen.
Unë u përpoqa të përdor këtë:
var MYPOSTS_REF = Database.database().reference().child("myPosts")
func getMyPostInHome(userId: String, completion: @escaping () -> Void, isEmpty: @escaping () -> Void) {
MYPOSTS_REF.observeSingleEvent(of: .value) { (snapshot) in
if !snapshot.hasChild(userId) {
isEmpty()
return
}
}
MYPOSTS_REF.child(userId).observe(.childChanged) { (snapshot) in
//get the Added/Removed post id here
}
}
Por duket se nuk mund ta marr ID-në e postimit
Shpresoj të kem qenë në gjendje të shpjegoj gjithçka... Jam përpjekur të jem sa më i qartë që kam mundur.. Nëse jo, ju lutem më njoftoni.
A mundet dikush të më ndihmojë? Faleminderit.
------UPDATE Unë jam duke vëzhguar fëmijën Shtuar kështu
func observePostAdded(userId: String, completion: @escaping (Post, FirebaseUser) -> Void) {
MYPOSTS_REF.child(userId).observeSingleEvent(of: .childAdded) { (snapshot) in
let key = snapshot.key
print("KEY \(key)")
Api.Post.getMyPosts(withId: key, completion: { (post) in
Api.User.observeUser(withId: post.uid, completion: { (user) in
completion(post, user)
})
})
}
}