Отображение данных сообщений только от вошедшего в систему пользователя swift / xcode / firebase - PullRequest
1 голос
/ 27 мая 2020

Привет, я следил за обучающими программами в Интернете, чтобы попытаться создать приложение для социальных сетей, и оно отлично работает, когда все сообщения, сделанные пользователями, помещаются в одну сцену, но в другой сцене я бы хотел, чтобы пользователи, которые в настоящее время вошли в систему, были могут видеть только свои сообщения вместо того, чтобы искать их сообщения из кучи сообщений, сделанных другими пользователями, ниже приведены примеры моего кода:

Код сообщения:

import Foundation
import UIKit
import Firebase


class Posts{

var id: String
var author: UserProfile
var text: String
var timestamp:Double
var createdAt:Date


init(id:String, author:UserProfile,text:String,timestamp:Double) {
    self.id = id
    self.author = author
    self.text = text
    self.timestamp = timestamp
    self.createdAt = Date(timeIntervalSince1970: timestamp / 1000)
}


static func parse(_ key:String, _ data:[String:Any]) -> Posts? {

    if let author = data["author"] as? [String:Any],
        let uid = author["uid"] as? String,
        let name = author["name"] as? String,
        let photoURL = author["photoURL"] as? String,
        let url = URL(string:photoURL),
        let text = data["text"] as? String,
        let timestamp = data["timestamp"] as? Double {

        let userProfile = UserProfile(uid: uid, name: name, photoURL: url)
        return Posts(id: key, author: userProfile, text: text, timestamp:timestamp)


        func performDeepQuery() {
             guard let user = Auth.auth().currentUser else { return }
            let uid = user.uid
            let ref = Database.database().reference().child("posts")
            let query = ref.queryOrdered(byChild: "author/uid").queryEqual(toValue: uid)
            query.observeSingleEvent(of: .value, with: { snapshot in
                let allPosts = snapshot.children.allObjects as! [DataSnapshot]
                for postSnap in allPosts {

                    let text = postSnap.childSnapshot(forPath: "text").value as? String ?? "No Text"
                    print(text)
                   //same as above
                }
            })
        }



  }

  return nil }
 }

func numberOfSections(in tableView: UITableView) -> Int {
     return 2

 }

 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
     switch section {
            case 0:
                return theposts.count
            case 1:
                return fetchingMore ? 1 : 0
            default:
                return 0
            }    }


 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if indexPath.section == 0 { let cell = HomeViewControllerScene.dequeueReusableCell(withIdentifier: "postCell", for: indexPath) as! Posting_TableViewCell
     cell.set(theposts: theposts[indexPath.row])
     return cell}
 else {
         let cell = HomeViewControllerScene.dequeueReusableCell(withIdentifier: "loadingCell", for: indexPath) as! LoadingCell
         cell.spinner.startAnimating()
         return cell
     }
 }


 func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {


     cellHeights[indexPath] = cell.frame.size.height
 }


 func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
        return cellHeights[indexPath] ?? 72.0
    }

Пожалуйста, помогите кому-нибудь я здесь, я долго чесал затылок с этим !!!

1 Ответ

1 голос
/ 29 мая 2020

Я считаю, что вопрос в том, как получить сообщения для определенного пользователя. Структура выглядит хорошо, но нет необходимости иметь дочерний узел «автор» в каждом сообщении, поэтому вместо этого:

posts
   post_id_0
      author
         author data
      text: "Hello, World"
      uid: "uid_0"

сделайте это

posts
   post_id_0
      text: "Hello, World"
      uid: "uid_0"
      name: "usmaan"
      photoURL:"https://firebasestorage..."

Итак, теперь просто запросите этих пользователей сообщений (это для Firestore, прокрутите вниз для решения RTDB) ...

func getThisUsersPosts() {
    let uid = "uid_0" //this users uid
    self.db.collection("posts]").whereField("uid", isEqualTo: uid).getDocuments { (snapshot, error) in
        if let err = error {
            print(err.localizedDescription)
            return
        }

        if let doc = snapshot?.documents {
            for d in doc {
                let text = d.get("text") as? String ?? "No Post Text"
                print(text)
            }
        } else {
            print("no posts found")
        }
    }
}

self.db указывает на мой Firestore.

EDIT:

OP использует базу данных реального времени, поэтому вот код для этого

func getThisUsersPosts() {
    let uid = "uid_0"
    let ref = self.ref.child("posts") //self.ref points to MY firebase.
    let query = ref.queryOrdered(byChild: "uid").queryEqual(toValue: uid)
    query.observeSingleEvent(of: .value, with: { snapshot in
        let allPosts = snapshot.children.allObjects as! [DataSnapshot]
        for postSnap in allPosts {
            let text = postSnap.childSnapshot(forPath: "text").value as? String ?? "No Text"
            print(text)
        }
    })
}

EDIT 2:

OP хочет сохранить ту же структуру.

Для запроса данных на двухуровневой глубине мы используем так называемый Deep Query и будет выглядеть примерно так:

func performDeepQuery() {
    let uid = "uid_0"
    let ref = self.ref.child("posts")
    let query = ref.queryOrdered(byChild: "author/uid").queryEqual(toValue: uid)
    query.observeSingleEvent(of: .value, with: { snapshot in
        let allPosts = snapshot.children.allObjects as! [DataSnapshot]
        for postSnap in allPosts {
           //populate your tableView datasource here
           let post = PostClass()
           post.postId = postSnap.key
           post.name = postStap.childSnapshot("name").value as? String ?? "No Post Name"
           post.text = postStap.childSnapshot("text").value as? String ?? "No Post Text"
           self.postArray.append(post)
        }
        self.myTableView.reloadData()
    })
}

, который будет выполнять глубокий запрос к этой структуре

posts
   post_0
      author
         uid: "uid_0"
      name: "post 0 name"
      text: "post 0 text"

PostClass может быть следующим

class PostClass {
   var postId = ""
   var name = ""
   var text = ""
}

Дополнительная информация:

Чтобы получить текущий пользовательский uid (который также рассматривается в руководстве по началу работы) и предполагая, что вы аутентифицированы (иначе будет ноль)

guard let user = Auth.auth().currentUser else { return }
let uid = user.uid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...