根据布尔状态结交朋友,比较数组值、Firebase和Swift时发现困难

根据布尔状态结交朋友,比较数组值、Firebase和Swift时发现困难,swift,firebase,swift3,Swift,Firebase,Swift3,我正在制作一个聊天应用程序,我只想在这样的条件下交朋友:如果一个用户a有朋友userB==true,而同一个用户B有userA==true,我希望他们交朋友。为了让您更清楚,这里是json格式: 正如上面的json一样,userA将userB作为朋友,userB将userA&userC作为朋友,userC将只有userB作为朋友,因为userA没有userC作为他的朋友。这是我的数据模型,不确定它是否完美 import Foundation import SwiftyJSON struct F

我正在制作一个聊天应用程序,我只想在这样的条件下交朋友:如果一个用户a有朋友userB==true,而同一个用户B有userA==true,我希望他们交朋友。为了让您更清楚,这里是json格式:

正如上面的json一样,userA将userB作为朋友,userB将userA&userC作为朋友,userC将只有userB作为朋友,因为userA没有userC作为他的朋友。这是我的数据模型,不确定它是否完美

import Foundation
import SwiftyJSON

struct Friends {
var myFriends:[Bool]!

struct Friend {
let key: String
let is_friend: Bool
init(snap: FIRDataSnapshot) {
    self.key = snap.key
    self.is_friend = (snap.value != nil)
   }
}
这是一个函数,我试图通过它获取数据并比较它们,但它并没有按照我想要的那样工作

    func getFriendList() {

    if self.user != nil {
            _ = self.ref.child("user_friends").child((user?.uid)!).observeSingleEvent(of: .value, with: { snapshot in
                for snap in snapshot.children {
                  for friends in (snap as AnyObject).children {
                    // cast friend and append to myFriends
                    print(friends)
                    let friend = Friend(snap: friends as! FIRDataSnapshot)
                    self.myFriends.append(friend)
                    print("my friends are\(self.myFriends.description)")
                    print("friends count\(self.myFriends.count)")

                    if (self.myFriends.count > 0) {
                        for friend in self.myFriends {
                            _ = self.ref
                                .child("user_friends")
                                .child(friend.key)
                                .child("friends")
                                //.child((self.user?.uid)!)
                                .observeSingleEvent(of: .value, with: { snapshot in
                                print("Desired Snapshot\(snapshot)")
                                //Now I need to check the condition here

                          })
                        }
                      }
                    }
                }
            })


    }//FIRAuth ends here

}//getFriendList ends here

这是我实际的数据库设计:调试结果我想我需要使用两个字典并比较它们的值。这几乎就像instagram的功能一样,如果有人跟踪某个用户,而该用户又跟踪他,则启用了消息选项,消息选项直到他们相互跟踪后才会打开。请任何好心的人过来帮助我。我真的有麻烦了。谢谢。

您正在进行大量不需要的循环和解析。这就是我将如何做您正在尝试做的事情:

// A struct for friend nodes on a user account
struct Friend {
    let key: String
    let is_friend: Bool
    init(snap: FIRDataSnapshot) {
        self.key = snap.key
        self.is_friend = snap.value as! Bool
    }
}
// A struct for user account nodes
struct ChatUser {
    var friends = [Friend]()
    let user_ref: FIRDatabaseReference
    let key: String
    init(user_ref: FIRDatabaseReference) {
        self.user_ref = user_ref
        self.key = user_ref.key
    }
}

let currentUser = ChatUser(user_ref: self.user.ref)

func getFriendListForUser(user: ChatUser) {
    _ = user.ref.child("user_friends").observeSingleEvent(of: .value, with: { snapshot in
        for friend in snapshot.children {
            // cast friend and append to myFriends
            let friend = Friend(snap: friend)
            user.friends.append(friend)
        }
    })
}

// validate friend list in firebase for a given chat user
func validatedFriendsForUser(user: ChatUser) {
    for friend in user.friends {
        _ = FIRDatabase.database()
            .reference(withPath: friend.key)
            .child("friends")
            .child(self.currentUser.key)
            .observeSingleEvent(of: .value, with: { snapshot in
                if let status = snapshot as? Bool {
                    friend.is_friend = status
                }
            })
    }

    // Remove friends which are not confirmed in firebase
    self.currentUser.friends = user.friends.filter{ $0 }
}
// call our methods to fetch and filter user friends for current user
self.getFriendListForUser(user: self.currentUser)
self.validatedFriendsForUser(user: self.currentUser)

ValidatedFriendsforser不是必需的,但是如果您想检查用户A在数据库中是否将用户B的密钥设置为true。

在getFriendList函数中,如果您使用myFriends.appendfriend,它只会将所有朋友数据追加到数组中,这不是我的目的。我想要我在问题中提到的过滤列表。请帮助。这就是validatedFriendsForUser方法的用途。我们需要在数据库中的friends键下收集当前用户的所有好友。然后,我们循环遍历所有好友密钥,以验证当前用户的id在其各自的用户节点中是否设置为true。结果是一个ChatUser对象,其中包含一个朋友对象数组,表示数据库中用户的所有已验证朋友。这有帮助吗?你的答案很完美,我花了一段时间才领会,但谢谢你的好答案。我很困惑。如果你认为一个人不能与另一个人成为朋友,那么他就不能与另一个人成为朋友,这不是更符合逻辑吗?是的,你的答案是正确的,我正在找麻烦来解决这个问题。问题是,我需要找到当前firebase用户的朋友的用户ID。然后使用这些用户ID,我需要查看当前firebase用户是否存在于他们的好友列表中。如果这是真的,那么他们就是朋友。只是觉得很难,直到现在才解决:是的,但我的意思是,如果一个用户在当前用户的朋友列表中,那么他们就是朋友,而不检查当前用户是否也在另一个用户的朋友列表中,这不是更有意义吗。这就是数据扇出方法的全部要点。我的客户机要求是,当一个userA喜欢UserB的帖子,UserB也喜欢userA的帖子时,他们就是朋友。这就是为什么我要经历这些。是的,我知道,我解决了你的最后一个问题。但在我的代码中,currentUser的朋友如果没有currentUser作为朋友,这是绝对不会发生的。
// A struct for friend nodes on a user account
struct Friend {
    let key: String
    let is_friend: Bool
    init(snap: FIRDataSnapshot) {
        self.key = snap.key
        self.is_friend = snap.value as! Bool
    }
}
// A struct for user account nodes
struct ChatUser {
    var friends = [Friend]()
    let user_ref: FIRDatabaseReference
    let key: String
    init(user_ref: FIRDatabaseReference) {
        self.user_ref = user_ref
        self.key = user_ref.key
    }
}

let currentUser = ChatUser(user_ref: self.user.ref)

func getFriendListForUser(user: ChatUser) {
    _ = user.ref.child("user_friends").observeSingleEvent(of: .value, with: { snapshot in
        for friend in snapshot.children {
            // cast friend and append to myFriends
            let friend = Friend(snap: friend)
            user.friends.append(friend)
        }
    })
}

// validate friend list in firebase for a given chat user
func validatedFriendsForUser(user: ChatUser) {
    for friend in user.friends {
        _ = FIRDatabase.database()
            .reference(withPath: friend.key)
            .child("friends")
            .child(self.currentUser.key)
            .observeSingleEvent(of: .value, with: { snapshot in
                if let status = snapshot as? Bool {
                    friend.is_friend = status
                }
            })
    }

    // Remove friends which are not confirmed in firebase
    self.currentUser.friends = user.friends.filter{ $0 }
}
// call our methods to fetch and filter user friends for current user
self.getFriendListForUser(user: self.currentUser)
self.validatedFriendsForUser(user: self.currentUser)