gpt4 book ai didi

ios - Firebase 多个观察者复制单元格

转载 作者:行者123 更新时间:2023-11-28 08:04:47 26 4
gpt4 key购买 nike

我想在 tableView 中显示当前用户 friend ,但我无法让它完美地工作,当列表中的某人更改他的名字时单元格重复。

JSON:

    {
"users" : {
"friends_requests" : {
"EeLIxkOEfhMUlsM8WGnHdgeT8xW2" : {
"friends" : {
"WWOdh96Yr3Qs4N3GWDVq3OlQFfB2" : true
}
},
"WWOdh96Yr3Qs4N3GWDVq3OlQFfB2" : {
"friends" : {
"EeLIxkOEfhMUlsM8WGnHdgeT8xW2" : true
}
}
},
"profile" : {
"EeLIxkOEfhMUlsM8WGnHdgeT8xW2" : {
"birthday" : "02/08/2017",
"displayname" : "user2",
"email" : "11@1.1",
"gender" : "M"

},
"WWOdh96Yr3Qs4N3GWDVq3OlQFfB2" : {
"birthday" : "02/08/2017",
"displayname" : "user1",
"email" : "112@2.1",
"gender" : "M"
}
}

}
}

代码如下:

var friendList = [Userr]()
func addFriendObserver(_ update: @escaping () -> Void) {
CURRENT_USER_FRIENDS_REF.observe(.value, with: { (snapshot) in
self.friendList.removeAll()


let enumerator = snapshot.children
while let rest = enumerator.nextObject() as? FIRDataSnapshot {



self.ref.child("users").child("profile").child(rest.key).observe(.value, with: { (snapshot) in

guard let dictionary = snapshot.value as? [String: Any] else {
return
}




let user = Userr()

user.displayname = dictionary["displayname"] as? String

self.friendList.append(user)


DispatchQueue.main.async {
self.tableview.reloadData()
}



}, withCancel: nil)

我已经尝试了很多方法并多次问过这个问题,但仍然无法正常工作,也没有答案。

请有人帮我解决这个问题。

编辑: 我使用的新观察者:

 func showUsersObserver(_ update: @escaping () -> Void) {
CURRENT_USER_FRIENDS_REF.observe(.value, with: { (snapshot) in
self.friendList.removeAll()


let keys = snapshot.children
while let rest = keys.nextObject() as? FIRDataSnapshot {



self.getUser(rest.key, completion: { (user) in
self.friendList.append(user)

print(self.friendList.count) // This increase each time when user changing his name! or any changes hits his profile.

DispatchQueue.main.async {
self.tableview.reloadData()
}

update()
})

}



// If there are no children, run completion here instead
if snapshot.childrenCount == 0 {
update()
}
})
}

这是获取他们的个人资料数据:

func getUser(_ userID: String, completion: @escaping (User) -> Void) {
USER_REF.child(userID).observe(.value, with: { (snapshot) in

guard let dictionary = snapshot.value as? [String: Any] else {
return
}



let id = dictionary["uid"] as? String
let email = dictionary["email"] as? String
let DisplayName = dictionary["displayname"] as? String




completion(User(userEmail: email!, userID: id!, userDisplayName: DisplayName!))



})
}

和好友列表:

class User {

var uid: String!
var displayname: String!
var email: String!


init(userEmail: String, userID: String, userDisplayName: String) {

self.email = userEmail
self.uid = userID
self.displayname = userDisplayName

}
}

我正在使用 Userr 进行测试。但 User 是主要的 swift 文件。

最佳答案

尝试改变

self.ref.child("users").child("profile").child(rest.key).observe(.value, with: { (snapshot) in
...
})

self.ref.child("users").child("profile").child(rest.key).observeSingleEvent(of: .value, with: { (snapshot) in
...
})

.observe 会导致 ... 中的代码在每次引用路径中的数据发生更改时运行。因此,每次更改引用路径中的数据时,您都会附加到 friendList.observeSingleEvent 确保代码只执行一次。

如果您希望在用户数据更改时更新单元格,请继续使用 .observe 并在闭包内执行此操作:

让用户拥有一个名为 uid 的属性作为用户的推送 key

guard let dictionary = snapshot.value as? [String: Any] else {
return
}
let userID = snapshot.key
if let friend = self.friendsList.first(where: {$0.uid == userID}) {
friend.displayname = dictionary["displayname"] as? String
friend.email = dictionary["email"] as? String
friend.uid = dictionary["uid"] as? String
//update any other properties of the User class
completion(friend)
}
else {
let id = dictionary["uid"] as? String
let email = dictionary["email"] as? String
let displayName = dictionary["displayname"] as? String
//update other properties of the User class

let user = User(userEmail:email, userID:id, userDisplayName:displayName)
self.friendsList.append(user)
completion(user)
}

该代码将使任何时候用户的配置文件更改,它会检查 friendsList 数组中的任何用户是否具有相同的用户 ID,如果是,它会更新匹配userID 用户的显示名称。如果 friendsList 中没有用户与 userID 匹配,它将将该用户附加到 friendsList 的末尾,因为它是一个新用户,尚未在数组中。

关于ios - Firebase 多个观察者复制单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45488598/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com