Swift3中FBSDKGraphRequest返回数据时遇到一些问题

Swift3中FBSDKGraphRequest返回数据时遇到一些问题,swift3,fbsdk,Swift3,Fbsdk,我是Swift3的新手。现在,我正在尝试做一个.swift,它可以保存我需要的一些功能 例如:我希望获得如下所示的用户名,因此我创建了一个var来设置闭包中的值字符串。 一切都很好,在结束之前都有值字符串,但结束后值就消失了。。 发生了什么事!!??有人能告诉我吗?请。。非常感谢你 下面很冷: import UIKit import FBSDKLoginKit import FBSDKCoreKit class CheckStatus: FBSDKLoginButton { var

我是Swift3的新手。现在,我正在尝试做一个.swift,它可以保存我需要的一些功能

例如:我希望获得如下所示的用户名,因此我创建了一个var来设置闭包中的值字符串。 一切都很好,在结束之前都有值字符串,但结束后值就消失了。。 发生了什么事!!??有人能告诉我吗?请。。非常感谢你

下面很冷:

import UIKit
import FBSDKLoginKit
import FBSDKCoreKit

class CheckStatus: FBSDKLoginButton {

    var userID: String = ""
    var userName: String = ""
    var userLink: String = ""
    var userEmail: String = ""
    var userPictureUrl: String = ""

    func getUserDefault() {
        guard FBSDKAccessToken.current() != nil else {
            return
        }

        let userInfo: FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "id, name, email, link, picture"])
        userInfo.start(completionHandler: { (_, result, error) -> Void in
            if error == nil {
                self.readPermissions = ["email", "public_profile"] // FBSDKLoginButton's permission
                guard let userDefault: [String:AnyObject] = result as? [String:AnyObject] else {
                    return
                }
                guard let userDefaultID: String = userDefault["id"] as? String else {
                    return
                }
                guard let userDefaultName: String = userDefault["name"] as? String else {
                    return
                }
                guard let userDefaultLink: String = userDefault["link"] as? String else {
                    return
                }
                guard let userDefaultEmail: String = userDefault["email"] as? String else {
                    return
                }
                guard let userDefaultPicture: [String:AnyObject] = userDefault["picture"] as? [String:AnyObject] else {
                    return
                }
                guard let userDefaultData: [String:AnyObject] = userDefaultPicture["data"] as? [String:AnyObject] else {
                    return
                }
                guard let userDefaultUrl: String = userDefaultData["url"] as? String else {
                    return
                }

                self.userID = userDefaultID
                self.userName = userDefaultName
                self.userLink = userDefaultLink
                self.userEmail = userDefaultEmail
                self.userPictureUrl = userDefaultUrl
                print("----- User data below -----\nID: \(userDefaultID)\nName: \(userDefaultName)\nLink: \(userDefaultLink)\nEmail: \(userDefaultEmail)\nPicture: \(userDefaultUrl)\n ----------------------")
                print("Have value : \(self.userName)") // This is work
            }
        })

        print("No value : \(self.userName)") // No value !!
    }
}

print(“No value:\(self.userName)”)
是在start的完成处理程序之前执行的,因此您需要为getUserDefault方法创建completionHandler。@谢谢,但我不理解您的意思。我是否应该添加一些函数来处理此问题或其他问题?您希望在哪里访问此详细信息?表示调用此函数的位置。@NiravD实际上,我希望函数最后返回一个字典,以便我可以在ViewController的viewDidLoad()中调用此函数(CheckStatus().getUserDefault),以获取所需的全部信息。这就是为什么我要先打印userName,看看是否有值,这意味着你只需要
userDefault
dictionary,然后为它创建completionHandler。如果您不知道如何创建completionHandler,请告诉我。