2016-05-01 15 views
0

Ich versuche, den Benutzernamen und das Foto von Facebook in meinen Code aufzunehmen. Ich kann beides, aber das Problem ist, dass das Segment aufgerufen wird, bevor die Daten zu mir zurückkehren! Wenn ich also zum nächsten Bildschirm gehe, sind die Variablen null! Hier ist mein Code:Facebook-Daten können nicht schnell genug abgerufen werden

override func viewDidLoad() { 
    super.viewDidLoad() 

    //MARK: - FB Button customization: 

    if (FBSDKAccessToken.currentAccessToken() == nil){ 
     print("Not logged in") 
    } 
    else{ 
     print("This is where you perform a segue.") 
     fetchProfile() 
     performSegueWithIdentifier("nextfb", sender: self) 
    } 
} 

func fetchProfile() { 
    print("fetch profile") 

    let parameters = ["fields": "email, name, picture.type(large)"] 
    FBSDKGraphRequest(graphPath: "me", parameters: parameters).startWithCompletionHandler { (connection, result, error) -> Void in 

     if error != nil { 
      print(error) 
      return 
     } 
     if let name = result["name"] as? String { 
      self.nome = name 
      print(name) 
      print(self.nome) 
     } 
     if let email = result["email"] as? String { 
      self.email = email 
      print(email) 
     } 

     // pega a imagem do usuário: 
     if let data = result["picture"]?!["data"] 
     { 
      if let url = data!["url"] as? String 
      { 
       let profilePictureURL = url 
       let imgURL = NSURL(string: profilePictureURL) 
       let imageData = NSData(contentsOfURL: imgURL!) 
       let image = UIImage(data: imageData!) 
       print(image) 
       self.foto = image! 
      } 
     } 
    } 
} 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "nextfb" { 

     print("\nO NOME É: \(nome)\n") 
     let vc = segue.destinationViewController as! HomeViewController 
     vc.name = self.nome 
     //vc.photo = self.foto 
    } 
} 

Der zweite View-Controller druckt einen Nullwert für den Namen und dann die ersten View-Controller gibt den Namen und das Bild! (wenn ich bereits im zweiten View-Controller bin)

Wie kann ich diese Variablen über das Segment richtig übergeben? Jede Hilfe wird sehr geschätzt!

+1

Setzen Sie einfach den 'performSegueWithIdentifier (" nextfb ", sender: self)' an den Ort, an dem die Facebook-Daten geladen wurden, z. Am Ende des Blocks gehen Sie zu 'FBSDKGraphRequest' (stellen Sie sicher, dass Sie den UI-Aufruf für den Haupt-Thread ausführen). – luk2302

+0

Ich bin mir nicht sicher, ob ich es richtig gemacht habe, aber immer noch nicht funktioniert. Habe nur 'performSegueWithIdentifier (" nextfb ", sender: self)' jetzt genau, wo 'FBSDKGraphRequest' endet, aber immer noch den 2. VC ohne Daten lädt und nur dann den Benutzernamen ausgibt! –

+1

hast du es *** *** *** den Aufruf von 'FBSDKGraphRequest'? Vor dem zweiten Schließen '}' !? – luk2302

Antwort

2

Sie rufen performSegueWithIdentifier("nextfb", sender: self) an der falschen Stelle. Sie überprüfen das Vorhandensein Ihres Zugriffstokens, und wenn Sie nicht angemeldet sind, rufen Sie das Segment auf.

Statt dessen sollten Sie dies tun:

if let data = result["picture"]?!["data"] 
    { 
     if let url = data!["url"] as? String 
     { 
      let profilePictureURL = url 
      let imgURL = NSURL(string: profilePictureURL) 
      let imageData = NSData(contentsOfURL: imgURL!) 
      let image = UIImage(data: imageData!) 
      print(image) 
      self.foto = image! 
      performSegueWithIdentifier("nextfb", sender: self) 
     } 
    } 

Auf diese Weise können nur an den nächsten Regler gehen, wenn die Daten erfolgreich auf Ihrem View-Controller bestückt hat.

+0

Was sollte in diesem Fall der Absender sein? Auf diese Weise zeigt der xcode einen Fehler an: 'Implizite Verwendung von 'self' beim Schließen, benutze 'self'. Capture-Semantik explizit machen. –

+1

Der Absender kann sein, was auch immer Sie wollen - es hängt nur ab, welche Daten Sie auf dem nächsten View-Controller benötigen. Ich würde "nil" vorerst vererben, um sicherzugehen, dass das Segment korrekt aufgerufen wird, aber dann können Sie entscheiden, was danach passiert. – dokun1

+0

ja, 'nil' sollte jetzt funktionieren. – luk2302

Verwandte Themen