【发布时间】:2017-08-03 15:28:09
【问题描述】:
我想在 tableView 中显示当前用户的朋友,但我无法让它完美地工作,当列表中的某人更改他的名字时,单元格重复。
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 进行测试。但用户是主要的 swift 文件。
【问题讨论】:
-
查看
self.friendList.removeAll()尝试打印friendList.count以查看是否所有用户都被删除。您还应该在代码中包含 Userr 类 -
@Stefan 谢谢,我已经测试过了,它清空了列表。我已经编辑了我的问题。
标签: ios swift uitableview firebase