2016-02-10 27 views
6

voglio impostare nome utente per l'etichetta perché il mio blocco ("findObjectsInBackgroundWithBlock") sta prendendo tempo per completare e Label.text set nullo.Impostazione etichetta di testo dopo il completamento del blocco Swift

come impostare il testo dell'etichetta dopo aver completato il blocco ??

class test {   

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

getCurrentUser()   
lblUserName.text = userName  

}  

} 

Questo è il blocco in cui ottengo i dati utente da Parse.

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

Stai ancora utilizzando Parse :) – Vakas

+0

sì! Sto lavorando a un progetto che è quasi terminato una volta completato completerò il mio backend –

risposta

1

È possibile utilizzare un osservatore immobile qui in questo modo:

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

È possibile utilizzare un callback, che si definisce nella funzione GetCurrentUser

private func loadData() {  

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

} 


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

    // Your code 

    callback() 
} 

Swift Closures

0

query.findObjectsInBackgroundWithBlock è una chiamata asincrona. Il blocco di completamento fornito viene eseguito in un thread separato una volta ricevuta una risposta dal server.

Se si posiziona un punto di interruzione nella linea getCurrentUser() e si accede al flusso, sarà possibile comprendere chiaramente il flusso.

Ci sono diversi modi per raggiungere il risultato,

  1. È possibile impostare un osservatore immobile per userName e impostare la modifica tuo lblUserName
var userName: String? { 
    willSet(newUserName) { 
     if let username = newUserName { 
      lblUserName.text = username 
     } 
    } 
} 
  1. Y ou può aggiornare il valore della lblUserName all'interno del vostro completamento blocco
1

È possibile aggiungere un argomento funzione di gestore di completamento alla funzione GetCurrentUser e chiamare tale gestore quando si retrived i dati:

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)  
       } 
      } 
     } 
    } 
} 

Quindi passare la funzione di complemento in questo modo:

getCurrentUser() { (result: String) in 
    self.lblUserName.text = result 
} 

Non riesco a dimostrare che è pienamente funzionante co de come non ho XCode ora per testarlo. Ma dovresti avere l'idea.