我尝试使用闭包,因为它似乎是明显的选择,但我仍然遇到问题。基本上我有用户登录Facebook,一旦他们有访问令牌,他们的数据被提取(只是名称和电子邮件)。我的观点中有两个标签,我想显示他们的姓名和电子邮件。
编辑:在Matt的建议之后:
// Get user info
func getUserInfo(finished: @escaping () -> Void) {
let params = ["fields" : "email, name"]
let graphRequest = GraphRequest(graphPath: "me", parameters: params)
graphRequest.start {
(urlResponse, requestResult) in
DispatchQueue.main.async {
switch requestResult {
case .failed(let error):
print("error in graph request:", error)
break
case .success(let graphResponse):
if let responseDictionary = graphResponse.dictionaryValue {
print(responseDictionary)
if let name = responseDictionary["name"] {
self.nameLabel.text = "Logged in as: \n\(name)"
}
if let email = responseDictionary["email"] {
self.emailLabel.text = "Your email is: \n\(email)"
} else {
self.emailLabel.text = "Your email is: "
}
print(responseDictionary["name"])
print(responseDictionary["email"])
}
}
finished()
}
}
}
并在viewDidLoad
if AccessToken.current != nil {
getUserInfo {
self.view.addSubview(self.emailLabel)
self.view.addSubview(self.nameLabel)
self.setupNameLabel()
self.setupEmailLabel()
}
}
初始化标签
let emailLabel: UILabel = {
let frame = CGRect(x: 100, y: 100, width: 400, height: 200)
let label = UILabel(frame: frame)
label.textAlignment = NSTextAlignment.center
label.text = ""
label.numberOfLines = 2
label.textColor = UIColor.black
label.translatesAutoresizingMaskIntoConstraints = false
return label
}()
let nameLabel: UILabel = {
let frame = CGRect(x: 100, y: 100, width: 400, height: 200)
let nLabel = UILabel(frame: frame)
nLabel.textAlignment = NSTextAlignment.center
nLabel.text = ""
nLabel.numberOfLines = 2
nLabel.textColor = UIColor.black
nLabel.translatesAutoresizingMaskIntoConstraints = false
return nLabel
}()
标签的约束
func setupEmailLabel() {
emailLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
emailLabel.topAnchor.constraint(equalTo: nameLabel.bottomAnchor, constant: 30).isActive = true
emailLabel.widthAnchor.constraint(equalToConstant: 150).isActive = true
emailLabel.heightAnchor.constraint(equalToConstant: 73).isActive = true
}
func setupNameLabel() {
nameLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
nameLabel.topAnchor.constraint(equalTo: facebookShareButton.topAnchor, constant: -230).isActive = true
nameLabel.widthAnchor.constraint(equalToConstant: 150).isActive = true
nameLabel.heightAnchor.constraint(equalToConstant: 73).isActive = true
}
答案 0 :(得分:0)
你所做的唯一问题是:
您没有在完成处理程序中调用finished()
,并且
您未能确定自己是主线程。
所以,它很容易修复。你有这个:
graphRequest.start {
(urlResponse, requestResult) in
// ... your stuff (switch statement)
}
finished()
将其更改为:
graphRequest.start {
(urlResponse, requestResult) in
DispatchQueue.main.async {
// ... your stuff (switch statement)
finished()
}
}