Я пытаюсь читать и писать в Firebase на основе уже созданных ссылок - PullRequest
0 голосов
/ 13 декабря 2018

введите описание изображения здесь

У меня есть файл userProfile:

class UserProfile {
    var uid:String
    var email: String
    var username:String
    var photoURL:URL

    init(uid:String, email:String, username:String, photoURL:URL) {
        self.uid = uid
        self.email = email
        self.username = username
        self.photoURL = photoURL
    }
}

и файл сообщения

class Post {
    var id:String
    var author:UserProfile
    var text:String
    var timestamp:Date

    init(id:String, author:UserProfile, text:String,timestamp:Double) {
        self.id = id
        self.author = author
        self.text = text
        self.timestamp = Date(timeIntervalSince1970: timestamp / 1000)//divided by 1000 because firebase stores dates as milliseconds
    }
} 

Этокак это показано в firebase введите описание изображения здесь

Итак, я пытаюсь повторно использовать ссылки (имя пользователя, дату и urlimage), которые использовались в этих двух файлах перед этим.

Вот код, который используется для почтового файла:

func oberseverRoomatePostFeed(){

     let postRef = Database.database().reference().child("posts")
        postRef.observe(.value, with: { snapshot in

             var currentUserRoomatePose = [Post]()//temporary array

            //array****************************
            for child in snapshot.children {
                if let roommateSnapshot = child as? DataSnapshot,
                    let dict = roommateSnapshot.value as? [String:Any],

                let author = dict["author"] as? [String:Any],
                    let uid = author["uid"] as? String,
                    let photoURL = author["photoURL"] as? String,
                    let email = author["email"] as? String,
                    let username = author["username"] as? String,
                        let url = URL(string:photoURL),
                        let text = dict["text"] as? String,
                        let timeStamp = dict["timestamp"] as? Double{

                    let userP = UserProfile(uid: uid, email: email, username: username, photoURL: url)
                    let post = Post(id: roommateSnapshot.key, author: userP, text: text, timestamp: timeStamp)
                    currentUserRoomatePose.append(post)
                }
            }
            self.posts = currentUserRoomatePose
            self.tableView.reloadData()
        })
}

А вот что у меня есть

class User: NSObject {
    var name: String?
    var currentUser: UserProfile
    var currentPost: Post

    init(dictionary: [String: Any], currentUser:UserProfile, currentPost:Post) {
        self.name = dictionary["name"] as? String ?? ""
        self.currentUser = currentUser
        self.currentPost = currentPost
    }
}
and
    func fetchUser() {

        let postRef = Database.database().reference().child("users")
            postRef.observe(.value, with: { snapshot in

                var currentUsers = [User]() // temp array
                for child in snapshot.children {
                    if let userSnapshot = child as? DataSnapshot,
                    let dict = userSnapshot.value as? [String: Any],

                        let author = dict["author"] as? [String:Any],
                        let uid = author["uid"] as? String,
                        let photoURL = author["photoURL"] as? String,
                        let email = author["email"] as? String,
                        let username = author["username"] as? String,
                        let url = URL(string:photoURL),
                        let text = dict["text"] as? String,
                        let timeStamp = dict["timestamp"] as? Double {

                        let userP = UserProfile(uid: uid, email: email, username: username, photoURL: url)
                        let user = User(dictionary: [String : Any], currentUser: userP, currentPost: Post)
                    }

                }

            })
    }

введите описание изображения здесь

введите описание изображения здесь

func checkLogin() {
    if Auth.auth().currentUser?.uid == nil {
        perform(#selector(backButton), with:nil, afterDelay:0)
    } else {
        let uid = Auth.auth().currentUser?.uid
        Database.database().reference().child("Users/profile/").child(uid!).observeSingleEvent(of: .value, with: {(snapshot) in

            if let dictionary = snapshot.value as? [String: AnyObject] {
                self.navigationItem.title = dictionary["username"] as? String
            }
        }, withCancel: nil)
    }
}


  "Users" : {
     "kFjK5Kcrk7dLCnd3fQOnhBcPQHz1" : {
        "Email" : "cmhughes95@gmail.com",
        "Full Name" : "Cameron Hughes",
        "Google UID" : "112185374105612274429",
        "provider" : "Google"
     },
     "profile" : {
        "0Ef8GJch5PPZ8yE9jLSXAS7fVoK2" : {
        "email" : "teclarke@aggies.ncat.edu",
        "password" : "Tecl6013",
        "photoURL" : "https://firebasestorage.googleapis.com/v0/b/aggie-wallet.appspot.com/o/user%2F0Ef8GJch5PPZ8yE9jLSXAS7fVoK2?alt=media&token=62827fc7-38ec-47ae-9972-c078ef1d486e",
        "username" : "tec95"
      },
        "EsqtPIFUWQbXh0ItLWK0W3qxOdI2" : {
        "email" : "teclarke@aggies.ncat.edu",
        "password" :    "Tecl6013",
        "photoURL" : "https://firebasestorage.googleapis.com/v0/b/aggie-wallet.appspot.com/o/user%2FEsqtPIFUWQbXh0ItLWK0W3qxOdI2?alt=media&token=40c82e6e-cc4d-4320-a0ab-434cc297567a",
        "username" : "tyrek95"
      },

1 Ответ

0 голосов
/ 15 декабря 2018

Сразу же возникает проблема с узлом пользователей.У вас есть то, что выглядит как uid на том же уровне, что и узел под названием «профиль», который затем содержит другие идентификаторы пользователя.Это не сработает.Все идентификаторы должны быть на одном уровне.Узлы также содержат разные дочерние узлы, поэтому неясно, какова цель.Это была бы лучшая структура:

users
   uid_0
     email: "test@test.com"
     photoURL: "https://www.xxxxxx"
     username: "tyrek95"
   uid_1
     email: "yipee@yipee.com"
     photoURL: "https://www.yyyyy"
     username: "someusername"

Судя по комментариям, вы пытаетесь получить одно имя пользователя для добавления в заголовок - в этом вопросе много лишнего кода, если этозадание.Функции checkLogin и fetchUser не вызываются, и хотя денормализация в узле posts хороша, это ненужные дублирующие данные - вам не нужно дублировать электронную почту, photoURL, как вы знаете uid, и можете получить ее из узла users

Лучшая структура:

posts
  post_0
    author: "uid_0"
    text: "Hello, World"
    timestamp: "some time"
  post_1
    author: "uid_1"
    text: "What's happening?"
    timestamp: "some time"

Для простоты давайте возьмем один пост и связанного с ним пользователя и распечатаем то, что этот пользователь сказал в своем сообщении.

let usersRef = self.ref.child("users")
let postsRef = self.ref.child("posts")
let postNum = "post_0"
let postToGetRef = postsRef.child(postNum)
postToGetRef.observeSingleEvent(of: .value, with: { postSnap in
    let postDict = postSnap.value as! [String: Any]
    let uid = postDict["author"] as! String
    let postText = postDict["text"] as! String
    let userToGetRef = usersRef.child(uid)
    userToGetRef.observeSingleEvent(of: .value, with: { userSnap in
        let userDict = userSnap.value as! [String: Any]
        let userName = userDict["username"] as! String
        print("\(userName) said \(postText)") //here you put the name in the title bar
    })
})

и вывод

tyrek95 said Hello, World

Я сделал это для одного поста, но его можно легко расширить, используя .value на узле постов, который будет читать все посты, а затем перебирать ихв for..loop, чтобы получить информацию о посте и пользователя для каждого поста.

Обратите внимание, что здесь нет проверки ошибок для краткости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...