使用Facebook好友

时间:2017-07-24 06:26:28

标签: ios swift facebook-graph-api firebase firebase-realtime-database

这个想法是填充一个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()
没有运气。我希望有更好,更快的方法来实现目标。提前谢谢。

1 个答案:

答案 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;而不是直接访问节点,如果你正在做很多直接加载节点并避免查询,可以加快访问速度。