2016-02-10 8 views
6
Abschluss

Ich möchte ein Label Benutzernamen gesetzt, weil mein Block („findObjectsInBackgroundWithBlock“) Zeit nimmt abzuschließen und Label.text Sätze nil.Rahmen Beschriftungstext nach dem Block Swift

Wie man Etikettentext nach Abschluss des Blocks einstellen ??

class test {   

var userName: String? // variable to access user name returned by block   
private func loadData() {  

getCurrentUser()   
lblUserName.text = userName  

}  

} 

Dies ist der Block, in dem ich von Benutzerdaten von Parse bin immer.

private func getCurrentUser() {   

     if PFUser.currentUser() != nil { 

      currentUser = PFUser.currentUser()?.username  
      let query = PFQuery(className: "_User")  
      query.whereKey("username", equalTo: currentUser!)  
      query.findObjectsInBackgroundWithBlock { (currentUsers, error) -> Void in 
       if error == nil {  
        for user in currentUsers! {  
         userName = user["name"] as? String  
        } 
       } 
      } 
     } 
    } 
+0

Verwenden Sie immer noch Parse :) – Vakas

+0

ja! Ich arbeite an einem Projekt, das fast fertig ist, sobald es fertig ist, werde ich mein Backend ändern –

Antwort

1

können Sie eine Eigenschaft Beobachter verwenden hier wie folgt aus:

var userName: String? { 
    didset { 
     if let name = username { 
      lblUserName.text = name 
     } 
    } 
} 
0

Sie können einen Rückruf verwenden, die Sie in der GetCurrentUser Funktion definieren

private func loadData() {  

    getCurrentUser({   
     self.lblUserName.text = userName 
    }) 

} 


private func getCurrentUser(callback:() ->()){ 

    // Your code 

    callback() 
} 

Swift Closures

0

query.findObjectsInBackgroundWithBlock ist ein asynchroner Aufruf Der dafür vorgesehene Completion-Block wird in einem separaten Thread ausgeführt, sobald Sie eine Antwort vom Server erhalten.

Wenn Sie in der Zeile getCurrentUser() einen Haltepunkt platzieren und den Durchfluss schrittweise ausführen, können Sie den Durchfluss deutlich nachvollziehen.

Es gibt verschiedene Möglichkeiten, wie Sie das Ergebnis erreichen können,

  1. Sie können für userName eine Eigenschaft Beobachter gesetzt und stellen Sie die Änderung Ihre lblUserName
var userName: String? { 
    willSet(newUserName) { 
     if let username = newUserName { 
      lblUserName.text = username 
     } 
    } 
} 
  1. Y ou kann den Wert des lblUserName innerhalb Ihrer Fertigstellung Block
1

aktualisieren können Sie ein Funktionsargument zu Ihrer GetCurrentUser Funktion Abschluss-Handler hinzufügen und diese Handler aufrufen, wenn Sie die Daten retrived:

private func getCurrentUser(completion: (result: String) -> Void) {   
    if PFUser.currentUser() != nil { 
     currentUser = PFUser.currentUser()?.username  
     let query = PFQuery(className: "_User")  
     query.whereKey("username", equalTo: currentUser!)  
     query.findObjectsInBackgroundWithBlock { (currentUsers, error) -> Void in 
      if error == nil {  
       for user in currentUsers! {  
        completion(user["name"] as? String)  
       } 
      } 
     } 
    } 
} 

Dann übergeben Sie die Complition-Funktion wie folgt:

Ich kann nicht beweisen, dass es vollständig funktioniert co de, da ich jetzt keinen XCode habe, um es zu testen. Aber Sie sollten die Idee bekommen.