一旦数据请求完成,我怎么才能给标签提供文字?

时间:2017-03-03 23:56:34

标签: ios swift

我尝试使用闭包,因为它似乎是明显的选择,但我仍然遇到问题。基本上我有用户登录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
}

1 个答案:

答案 0 :(得分:0)

你所做的唯一问题是:

  1. 您没有在完成处理程序中调用finished(),并且

  2. 您未能确定自己是主线程。

  3. 所以,它很容易修复。你有这个:

    graphRequest.start {
        (urlResponse, requestResult) in
        // ... your stuff (switch statement)
    }
    finished()
    

    将其更改为:

    graphRequest.start {
        (urlResponse, requestResult) in
        DispatchQueue.main.async {
            // ... your stuff (switch statement)
            finished()
        }
    }