2016-04-25 41 views
5

Sto tentando di eseguire una richiesta alamofire Share rapidafare una richiesta asincrona alamofire sincrona

func checkIfUserExistsInDB(userName: String) -> NSString 
{ 

    print ("IN") 
    var info: NSString = "" 

    Alamofire.request(.POST, "http://blablabla.com/getuserdata", parameters: ["queryValue": userName,], encoding:.JSON).responseJSON { request, response, result in 
    switch result { 
    case .Success(let JSON): 
     info = NSString(data: JSON.dataUsingEncoding(NSUTF8StringEncoding)!, encoding: NSUTF8StringEncoding)! 

    case .Failure(let data, _): 
     print ("IN") 
     if let data = data { 
      info = (NSString(data: data, encoding: NSUTF8StringEncoding)!) 

      print (info) 
     } 

    } 
    } 

    return info 
} 

ma io sono in esecuzione in difficoltà che lo rende in modo sincrono. Sono consapevole che l'esecuzione di una funzione asincrona (come quella fornita da Alamorfire) non è generalmente accettata, ma nel mio caso devo farlo in modo sincrono.

+1

cercare di capire il modello asincrono. C'è sempre un modo per conformarsi ad esso. Nel tuo caso implementa un blocco di completamento per restituire i dati, ad esempio 'func checkIfUserExistsInDB (userName: String, completion: (String) -> Void)' – vadian

+0

potresti elaborare? Sono molto nuovo per swift – mark

+0

Ho scritto una risposta. – vadian

risposta

7

È facile implementare un blocco di completamento in Swift.

Questa è la vostra funzione con un blocco di completamento

func checkIfUserExistsInDB(userName: String, completion:(String) -> Void) 
{ 
    Alamofire.request(.POST, "http://blablabla.com/getuserdata", parameters: ["queryValue": userName,], encoding:.JSON).responseJSON { request, response, result in 
    switch result { 
    case .Success(let JSON): 
     let info = String(data: JSON.dataUsingEncoding(NSUTF8StringEncoding)!, encoding: NSUTF8StringEncoding)! 
     completion(info) 

    case .Failure(let data, _): 
     if let errorData = data, info = String(data: errorData, encoding: NSUTF8StringEncoding) { 
     completion(info) 
     } 
    } 
    } 
} 

e può essere chiamato con (info è la stringa in modo asincrono restituita)

checkIfUserExistsInDB("string") { (info) in 
    print(info) 
}