如何在Firebase Swift中实现用户之间的朋友关系?

时间:2018-02-04 19:33:28

标签: ios swift firebase firebase-realtime-database

如何在swift中使用Firebase来实现用户之间的朋友关系?

以下是我当前的DataService.swift文件。

import Foundation
import Firebase

let DB_BASE = Database.database().reference()

class DataService {
    // creates instance of the class inside itself
    static let instance = DataService()

    private var _REF_BASE = DB_BASE
    private var _REF_USERS = DB_BASE.child("users")

    var REF_BASE: DatabaseReference {
        return _REF_BASE
    }

    var REF_USERS: DatabaseReference {
        return _REF_USERS
    }

    func createDBUser(uid: String, userData: Dictionary<String,Any>) {
        REF_USERS.child(uid).updateChildValues(userData)
    }

}

谢谢:)

2 个答案:

答案 0 :(得分:3)

不确定这是一个非常完整的答案,但可能会让你朝着正确的方向前进

假设我们在Firebase中有三个用户,并且数据存储在/ users节点中。拉里(uid_0)有两个朋友,Moe和Curly

users
  uid_0
    name: "Larry"
    friends:
       uid_1: true
       uid_2: true
  uid_1
    name: "Moe"
  uid_2
    name: "Curly"

写好友节点的代码是这样的

let usersRef = fbRed.child("users")
let uid0Ref = usersRef.child("uid_0")
let friendsRef = uid0Ref.child("friends")
friendsRef.child("uid_1").setValue(true)
friendsRef.child("uid_2").setValue(true)

这非常冗长,可能会被压缩,但为了便于阅读,请保留这种方式。

请注意如果将来要进行查询或其他功能,这可能不是最佳解决方案。

答案 1 :(得分:1)

每个用户都应该通过他们的uid向其他用户提供 引用 的列表。不要在每个用户下存储整个朋友用户数据对象。这将大大增加您的数据库。

users ->
    "uid1" ->
        friendUids ->
            0 ->
                "uid2"
            1 ->
                "uid3"
    "uid2" ->
        friendUids ->
            0 ->
                "uid1"
    "uid3" ->
        friendUids ->
            0 ->
                "uid1"

假设您的用户有一个静态解码功能来处理来自Firebase的JSON,您需要做的就是检索用户数据:

extension DataService {

    func requestUserWithUid(_ uid: String, completion: @escaping (User?) -> Void) {
        REF_USERS.child(uid).observeSingleEvent(of: .value) { snapshot in
            completion(User.decode(snapshot.value))
        }
    }

    func requestFriendsForCurrentUser(completion: @escaping ([User?]?) -> Void) {
        var friends = [User?]()

        guard let uid = Auth.auth().currentUser?.uid else {
            completion(.none)
            return
        }

        requestUserWithUid(uid) { user in
            guard let user = user else {
                completion(.none)
                return
            }

            for friendUid in user.friendUids {
                requestUserWithUid(friendUid) { friend in
                    friends.append(friend)
                }
            }

            completion(friends)
        }
    }
}

这只是许多如何实现它的有限示例。假设您的用户数据对象有一个名称,我们希望显示一个朋友列表&#39;名。

class FriendView: UIView, UITableViewDataSource {

    fileprivate var friends = [User?]()

    fileprivate let tableView = UITableView(frame: .zero, style: .plain)

    // ----------------------------------------------------------------------------
    // MARK: UIView
    // ----------------------------------------------------------------------------

    override init(frame: CGRect) {
        super.init(frame: frame)

        addSubview(tableView)

        tableView.frame = frame
        tableView.dataSource = self

        loadFriends()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder :) has not been implemented")
    }

    // ----------------------------------------------------------------------------
    // MARK: Private
    // ----------------------------------------------------------------------------

    fileprivate func loadFriends() {
        DataService.instance.requestFriendsForCurrentUser() { friends in
            if let friends = friends {
                self.friends = friends
                self.tableView.reloadData()
            }
        }
    }

    // ----------------------------------------------------------------------------
    // MARK: UITableViewDataSource
    // ----------------------------------------------------------------------------

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

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return friends.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell()
        cell.textLabel?.text = friends[indexPath.row]?.name
        return cell
    }
}