2016-02-08 7 views
0

J'essaie d'ajouter des données à mon modèle de données afin de le tester J'imprime l'information récupérée via Alamofire mais mon problème est que certaines données ont besoin d'appeler l'API à nouveau, il devient nul quand je imprime le. Voici mon codeAttendez plusieurs demandes Alamofire

code pour obtenir les données de la personne

func printAPI(){ 

swApiHandler.requestSWPApi("http://swapi.co/api/people", completionHandler: {(response, error) in 

    let json = JSON(response!) 
    let jsonResult = json["results"] 

    for (index,person):(String, JSON) in jsonResult{ 
     let name = person["name"].stringValue 
     let height = person["height"].intValue 
     let mass = person["mass"].intValue 
     let hairColor = person["hair_color"].stringValue 
     let skinColor = person["skin_color"].stringValue 
     let eyeColor = person["eye_color"].stringValue 
     let birthYear = person["birth_year"].stringValue 
     let gender = person["gender"].stringValue 
     let homeWorldUrl = person["homeworld"].stringValue 
     let homeWorldNameKey = "name" 
     let homeWorld = self.getSWApiSpecificValue(homeWorldUrl, strKey: homeWorldNameKey) 

     print("Name: \(name)") 
     print("Height: \(height)") 
     print("Mass: \(mass)") 
     print("Hair Color: \(hairColor)") 
     print("Skin Color: \(skinColor)") 
     print("Eye Color: \(eyeColor)") 
     print("Birth Year: \(birthYear)") 
     print("Gender: \(gender)") 
     print("Home World: \(homeWorld)") 
     print("------------------------------") 
    } 
}) 

} 

code pour obtenir la valeur spécifique

func getSWApiSpecificValue(strUrl: String, strKey: String) -> String{ 
    var name = "" 
    swApiHandler.requestSWPApi(strUrl, completionHandler: {(response,error) in 
     let json = JSON(response!) 
     print(json[strKey].stringValue) 
     name = json[strKey].stringValue 
    }) 

    return name 
} 

Si vous voulez savoir ici le modèle JSON est

JSON Model

Et pour l'exécution du code est ici la sortie Output

+0

Quel est le problème? –

+0

Placez des points d'arrêt dans vos gestionnaires d'achèvement et renvoyez des instructions, puis essayez de déboguer l'application. –

+0

@Pooja Regardez Homeworld la valeur est vide car elle est récupérée de manière asynchrone (Appel Api imbriqué) –

Répondre

1

Vous devriez faire votre appel api en arrière-plan et une fois qu'il est terminé remplir vos données sur la file d'attente principale. il suffit de changer votre code pour obtenir une valeur spécifique à celui-ci:

func getSWApiSpecificValue(strUrl: String, strKey: String) -> String{ 
    var name = "" 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) {() -> Void in 
swApiHandler.requestSWPApi(strUrl, completionHandler: {(response,error) in 
    dispatch_async(dispatch_get_main_queue()) { 
     let json = JSON(response!) 
     print(json[strKey].stringValue) 
     name = json[strKey].stringValue 
     return name 
    } 
    }) 
} 
} 

Dans le code ci-dessus vous obtenez d'abord faire une demande au serveur background et si vous obtenez une réponse en file d'attente main vous remplir variable name. En outre, il est préférable de changer votre fonction d'appel d'api à quelque chose comme ça:

func getDataFromServer(ulr: String, success: (([AnyObject]) -> Void)?, failure: (error: ErrorType) -> Void){ 
} 

De cette façon, vous pouvez gérer vos erreurs et si le succès obtenir vos données.

+0

ouah! heureux que vous avez commenté dans mon message. Je vais vérifier ce code demain matin et voir si ça fonctionne, d'ailleurs merci pour la suggestion. Ce serait très utile pour mon code: D –