Сохранение данных в GraphRequest с FBSDK - PullRequest
0 голосов
/ 08 июля 2020

Добрый день, сообщество,

Я пытаюсь получить данные из graphrequest и передать их другому viewController, но, по-видимому, они не сохраняются в переменной, за исключением того, что запрос, данные удаляются, они не сохраняются в переменной.

Была ли у кого-нибудь из вас эта проблема или что-то в этом роде?

Я оставляю свой код ниже моего первого viewController

import UIKit
import FBSDKLoginKit

class ViewController: UIViewController,FBSDKLoginButtonDelegate {

@IBOutlet var test: UILabel!


var comprobacion = "";

override func viewDidLoad() {
    super.viewDidLoad()
    if let token = FBSDKAccessToken.current(), !token.isExpired {

        let loginButton = FBSDKLoginButton()
        loginButton.center = view.center
        loginButton.layoutIfNeeded()
        loginButton.delegate = self
        view.addSubview(loginButton)
        loginButton.awakeFromNib()
        loginButton.readPermissions = ["public_profile", "email"]
        
    }else{
        
    let loginButton = FBSDKLoginButton()
    loginButton.center = view.center
    loginButton.delegate = self
    view.addSubview(loginButton)
    loginButton.layoutIfNeeded()
    loginButton.awakeFromNib()
    loginButton.readPermissions = ["public_profile", "email"]
    
    }
    
}

func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error!) {
    
    let resultado = result?.token?.tokenString
    
    let request = FBSDKLoginKit.FBSDKGraphRequest(graphPath: "me", parameters: ["fields":"email,name"], tokenString: resultado, version: nil, httpMethod: "get")
    
    request?.start(completionHandler: { connection , result, error in
        
        let datos: [String:AnyObject] = result as! [String:AnyObject];
        
        self.comprobacion =  (datos["email"] as! NSString) as String;
        
        print("campos \(String(describing: result) )")
        
        self.test.text = self.comprobacion
        
    })
    
    performSegue(withIdentifier: "second", sender: self)
    let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
    let newViewController = storyBoard.instantiateViewController(withIdentifier: "SecondController") as! SecondController
    self.present(newViewController, animated: true, completion: nil)
    
    
     
    
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let destino = segue.destination as! SecondController
    destino.recibir = comprobacion;
    
}


func loginButtonDidLogOut(_ loginButton: FBSDKLoginButton!) {
    
    print("GoodBye...   Hommi")
}
}

Я оставляю свой код ниже моего второго viewController

 import UIKit

class SecondController: UIViewController {

@IBOutlet var Email: UILabel!
var recibir: String!



override func viewDidLoad() {
    super.viewDidLoad()
    print("recibir \(String(describing: recibir))")
  
    Email.text = String(recibir)
}

 }

Я понял, что электронное письмо не сохраняется в моей переменной, так как оно находится вне запроса clousure. Начать, если я напечатайте переменную, она пуста.

помощь?

1 Ответ

1 голос
/ 08 июля 2020

Изменить порядок кода на

func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error!) {
    
    let resultado = result?.token?.tokenString
    
    let request = FBSDKLoginKit.FBSDKGraphRequest(graphPath: "me", parameters: ["fields":"email,name"], tokenString: resultado, version: nil, httpMethod: "get")
    
    request?.start(completionHandler: { connection , result, error in
        
        let datos: [String:AnyObject] = result as! [String:AnyObject];
        
        self.comprobacion =  (datos["email"] as! NSString) as String;
        
        print("campos \(String(describing: result) )")
        
        self.test.text = self.comprobacion 

        DispatchQueue.main.async {
           self.performSegue(withIdentifier: "second", sender: self) 
        }
        
    })
    
    
}

Советы

1- Код внутри request?.start(completionHandler запускается асинхронно после перехода, поэтому переход происходит, пока ваш var все еще равен нулю

2- Не создавайте экземпляр av c и не представляйте его, когда вы уже используете переход

...