Swift Firebase получить данные для объекта класса - PullRequest
0 голосов
/ 30 мая 2019

Я хочу получить следующую структуру (скриншот базы данных Firebase):

enter image description here

В чатах у меня есть идентификатор чата.Есть пользователи с дочерним ИД пользователя и значениями идентификатора и имени.Сначала я ищу чаты, которые есть у пользователя, и хочу узнать подробности о chatId (пользователи с их идентификатором и именем)

У меня есть следующий класс в Swift:

class Chat {
var chatId: String!
var userIds: [String]!
var userNames: [String]!
}

У меня есть следующий код для получения деталей, но я не получаю userIds или userNames из chatId:

func getChatsFromFirebase() {
    self.ref = Database.database().reference()
    self.ref?.child("users").child(userdefaults.getUserId()).child("chats").observe(.childAdded, with: { (snapshot) in
        let chat = Chat()
        chat.chatId = snapshot.key
        chat.userIds = []
        chat.userNames = []

        //print(chat.chatId)

        for i in 0..<self.chats.count {
            let usersRef = self.ref.child("chats").child(self.chats[i].chatId).child("users").observeSingleEvent(of: .value, with: { (snapshot) in
                let value = snapshot.value as? NSDictionary

                for userid in value!.allKeys as! [String] {
                    let usersdetailsRef = self.ref.child("chats").child(self.chats[i].chatId).child("users").child(userid).queryOrdered(byChild: "name").observeSingleEvent(of: .value, with: { (snapshot) in

                        let value = snapshot.value as? NSDictionary
                        //print(value)
                        let id = value?["id"] as? String ?? ""
                        let name = value?["name"] as? String ?? ""
                        //print( id + ": " + name)
                        chat.userIds.append(id)
                        chat.userNames.append(name)
                    })
                }
            })
        }
        self.chats.append(chat)
        self.tableView.reloadData()
    })
}

Я очень новичок в теме Firebase.Может ли кто-нибудь помочь мне здесь?Спасибо.

1 Ответ

1 голос
/ 30 мая 2019

Ну, вам нужно сначала изменить свою модель данных. В этом случае вам не нужно хранить значение id, 12345. Вы уже можете получить ключ. Кроме того, в /users/chats вы можете просто сохранить идентификатор чата как chat1 : IBDrbfku887BLIY или IBDrbfku887BLIY : true. Вы всегда можете получить их по значению или ключу соответственно.

И в вашем документе чата вам просто нужно указать идентификатор пользователя, то есть просто получить его и сохранить как user1 и user2. Вы можете добавить больше пользователей, если ваш вариант использования требует больше.

Переконфигурируйте вашу модель данных следующим образом.

enter image description here

Теперь вам нужно 2 объекта пользователей и чатов следующим образом:

Users.swift

class User : NSObject {

        private var _name: String!
        private var _username: String!
        private var _userid: String!
        private var _userRef: DatabaseReference!

        var name: String! {
            get {
                return _name
            } set {
                _name = newValue
            }
        }


        var username : String! {
            get {
                return _username
            } set {
                _username = newValue
            }
        }


        var userid: String! {
            get {
                return _userid
            } set {
                _userid = newValue
            }
        }

        var userRef: DatabaseReference! {
            get {
                return _userRef
            } set {
                _userRef = newValue
            }
        }

        init(userid: String, userData: Dictionary<String, Any>){

            self._userid = userid

            _userRef = Database.database().reference().child(_userid)

            if let username = userData["username"] as? String {
                self._username = username
            }

            if let name = userData["name"] as? String {
                self._name = name
            }

        }

    }

Chats.swift

class Chat : NSObject {

        private var _chatid: String!
        private var _user1: String!
        private var _user2: String!
        private var _chatRef: DatabaseReference!

        var user1: String! {
            get {
                return _user1
            } set {
                _user1 = newValue
            }
        }


        var user2 : String! {
            get {
                return _user2
            } set {
                _user2 = newValue
            }
        }


        var chatid: String! {
            get {
                return _chatid
            } set {
                _chatid = newValue
            }
        }

        var chatRef: DatabaseReference! {
            get {
                return _chatRef
            } set {
                _chatRef = newValue
            }
        }

        init(chatid: String, chatData: Dictionary<String, Any>){

            self._chatid = chatid

            _chatRef = Database.database().reference().child(_chatid)

            if let user = chatData["users"] as? Dictionary<String, Any> {
                if let user1 = user["user1"] as? String {
                    self._user1 = user1
                }
                if let user2 = user["user2"] as? String {
                    self._user2 = user2
                }
            }

        }

    }

Основная проблема / или упущенная проблема здесь - это тип данных. В /users ваш идентификатор 12345 будет иметь тип String. Но когда вы получаете то же самое из /chats, оно возвращается как Int. Это загружает значение, но никогда не конвертирует его. Всегда соблюдайте осторожность при заполнении / тестировании ваших данных.

Чтобы получить учетные данные пользователя, просто укажите это с помощью другого запроса. Вот что вы можете сделать:

var allUsers = [User]()
    var allChats = [Chat]()

    func viewDidLoad() {
        super.viewDidLoad()
        fetchAllChats()
    }

    func getUser(from userId: String, completion: @escaping (User) -> Void) {

        Database.database().reference().child("users").child(userId).observeSingleEvent(of: .value, with: { snapshot in
            if let datasnap = snapshot.value as? Dictionary<String, Any> {
                let user = User(userid: userId, userData: datasnap)
                completion(user)
            }
        })
    }

    func fetchAllChats() {
        Database.database().reference().child("chats").observeSingleEvent(of: .value, with: { snapshot in
           allChat.removeAll()
            if let snapshot = snapshot.value as? Dictionary<String, Any> {
                for snap in snapshot {
                    if let chatd = snap.value as? Dictionary<String, Any> {
                        let chat = Chat(chatid: snap.key, chatData: chatd)
                        self.allChats.append(chat)
                    }
                }
            }
            // collectionview.reloadData() <--------- only if required.
        })
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let chatData = allChats[indexPath.row]
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: CellId, for: indexPath) as! Cell
        getUser(from: chatData.user1) { user in
            cell.label.text = user.usernme
        }
        return cell
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...