这个想法是填充一个ID为Facebook Friends的字符串数组(来自Graph请求),然后在(Firebase)数据库中搜索这些ID(作为子项),最后用相关数据填充tableview(用户名) ,image)从数据库中读取。 这就是我尝试的原因:
let params = ["fields": "id"]
let request = FBSDKGraphRequest(graphPath: "me/friends", parameters: params, httpMethod: "GET")
let connection = FBSDKGraphRequestConnection()
connection.add(request, completionHandler: { (connection, result, error) in
if error != nil {
print("error")
} else {
if let userData = result as? [String:Any] {
let data: NSArray = userData["data"] as! NSArray
for i in 0..<data.count {
let dict = data[i] as! NSDictionary
let temp = dict.value(forKey: "id") as! String
// temp is an ID of a Facebook friend
self.ref.child("users").queryOrdered(byChild: "fbid").queryEqual(toValue: temp).observeSingleEvent(of: .value, with: { (snapshot) in
if snapshot.exists() {
let snap = snapshot.value as? NSDictionary
self.usersArray.append(snap?["username"] as! String)
self.tableView.reloadData()
//tableview is obviously populated with usersAray
}
})
}
}
}
})
connection.start()
没有运气。我希望有更好,更快的方法来实现目标。提前谢谢。
答案 0 :(得分:0)
代码看起来没问题并且似乎有效,所以一个修改就是在填充数组后重新加载tableView而不是每次通过 - 这样可以防止闪烁。您必须异步执行此操作,以便在加载数据后进行表更新。它真的不会加快速度,但从问题的哪个方面来看还不清楚&#39;慢&#39;
另一种选择是将.value的/ users节点加载到一个数组中,然后通过该数组查找fbid,而不是反复点击Firebase。根据用户数量,该解决方案可能/可能不可行。
一个超酷的选择是拥有一个单独的节点,只包含Facebook ID和用户名。因此,如果您的用户节点看起来像这样
/users
uid_0
fbid: "fbid_1"
name: "Pete"
uid_1
fbid: "fbid_2"
name: "George"
有另一个节点可以直接访问您想要的数据,而不是运行查询。
/lookup
fbid_1: "Pete"
fbid_2: "George"
这将极大地简化您的加载代码 - 类似这样的
for i in 0..<data.count {
let fbid = data[i]
let userRef = self.ref.child("lookup").child(fbid)
userRef.observeSingleEvent(of: .value, with: { snapshot in
let name = snapshot.value as! String
usersArray.append(name)
})
}
Firebase查询更重&#39;而不是直接访问节点,如果你正在做很多直接加载节点并避免查询,可以加快访问速度。