前提・実現したいこと
#####掲示版、トーク、通知のスクショ
Twitterのようなアプリを作っています。
ブロックしたユーザーを「掲示板、トーク、お知らせ」に表示させないようにする方法をご教授いただきたいです。
なお、データはFirebaseで管理しております。
現在の状況
現在、プロフィール画面のブロックボタンが押されると、
Firebaseの[user-blocking]に保存されるようにしてあります。
また、もう一度タップするとブロック解除されます。
#####Firebase
ブロックユーザーをFirebaseに追加するコード
Swift
1func blockUser(uid: String, completion: @escaping(DatabaseCompletion)) { 2 guard let currentUid = Auth.auth().currentUser?.uid else { return } 3 4 REF_USER_BLOCKING.child(currentUid).updateChildValues([uid: 1]) { (err, ref) in 5 REF_USER_BLOCKERS.child(uid).updateChildValues([currentUid: 1], withCompletionBlock: completion) 6 } 7 }
##掲示板、トーク、お知らせのデータ取得状況
###掲示板
現在、掲示板はTwitterとは異なり、フォローしているユーザーの投稿だけではなく、全てのユーザーの投稿が表示されるようになっています。
なので、ユーザーごとに取得する投稿を分けておりません。
#####Firebase
#####投稿を取得するコード
Swift
1func fetchPosts(completion: @escaping([Post]) -> Void) { 2 var posts = [Post]() 3 4 REF_POSTS.observe(.childAdded) { snapshot in 5 guard let dictionary = snapshot.value as? [String: Any] else { return } 6 guard let uid = dictionary["uid"] as? String else { return } 7 let postID = snapshot.key 8 9 UserService.shared.fetchUser(uid: uid) { user in 10 let post = Post(user: user, postID: postID, dictionary: dictionary) 11 posts.append(post) 12 completion(posts) 13 } 14 } 15 }
###トーク
トークは自分とやりとりしているユーザーとのトークのみを取得し、表示するようにしています。
#####Firebase
#####トークを取得するコード
Swift
1func fetchConversations(completion: @escaping([Conversation]) -> Void) { 2 var conversations = [Conversation]() 3 guard let uid = Auth.auth().currentUser?.uid else { return } 4 5 REF_USER_MESSAGES.child(uid).observe(.childAdded) { snapshot in 6 let uid = snapshot.key 7 guard let last = snapshot.children.allObjects.last as? DataSnapshot else { return } 8 9 self.fetchMessage(messageID: last.key) { message in 10 UserService.shared.fetchUser(uid: uid) { user in 11 let conversation = Conversation(user: user, message: message) 12 conversations.append(conversation) 13 completion(conversations) 14 } 15 } 16 } 17 }
###お知らせ
通知に関しても、トークと同様に自分に対するものだけを取得し、表示するようにしています。
#####Firebase
#####お知らせを取得するコード
Swift
1fileprivate func fetchNotifications(uid: String, completion: @escaping([Notification]) -> Void) { 2 var notifications = [Notification]() 3 4 REF_NOTIFICATIONS.child(uid).observe(.childAdded) { snapshot in 5 guard let dictionary = snapshot.value as? [String: AnyObject] else { return } 6 guard let uid = dictionary["uid"] as? String else { return } 7 8 UserService.shared.fetchUser(uid: uid) { user in 9 let notification = Notification(user: user, dictionary: dictionary) 10 notifications.append(notification) 11 completion(notifications) 12 } 13 } 14 } 15 16 func fetchNotifications(completion: @escaping([Notification]) -> Void) { 17 let notifications = [Notification]() 18 guard let uid = Auth.auth().currentUser?.uid else { return } 19 20 REF_NOTIFICATIONS.child(uid).observeSingleEvent(of: .value) { snapshot in 21 if !snapshot.exists() { 22 completion(notifications) 23 } else { 24 self.fetchNotifications(uid: uid, completion: completion) 25 } 26 } 27 }
現在、このような状況なのですが、
ブロックしたユーザーをはじき、表示させないようにする方法をご教授いただきたいです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。