2015-12-05 1 views
-1

J'ai un petit problème avec mon code rapide. L'instruction return de fin s'exécute avant que la valeur JSON ne soit stockée, de sorte qu'elle continue à me donner zéro. Comment puis-je faire le retour après que la valeur a été reçue?La déclaration de retour retourne avant que l'information ne soit reçue

func getArticleInfo(Id: String) -> String { 
    let url = val1 + val2 + val3 
    Alamofire.request(.GET, url).responseJSON { response in 
     switch response.result { 
     case .Success: 
      if let value = response.result.value { 
       dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) { 
        let json = JSON(value) 
        let singleAsset = json["url"].string 
       } 
      } 
     case .Failure(let error): 
      print(error) 
     } 
    } 
return singleAsset 
} 

Merci pour l'aide l'autre problème que j'ai. VOIR CI-DESSOUS J'essaie d'obtenir les catégories à remplir avec toutes les informations, puis appelez le vc.displayCatName() après son fait. Mais il le fait tard et je dois rafraîchir la page avant que je puisse voir l'information. Au-dessus, il suffit d'assigner les valeurs JSON aux touches qui peuplent les catégories ci-dessous. Mais vc.displayCatName() est une fonction d'un autre contrôleur de vue, mais il est exécuté avant que les valeurs de catégorie ne soient remplies. Donc, la seule façon dont je vois les valeurs est si je rafraichis la page manuellement en utilisant le Pull to Refresh. Donc, je veux les informations à être rempli alors vc.displayCatName() devrait fonctionner

      self.getAsset(id!) { (result) -> Void in 
          print("this is result \(result)") 
          let categories = Categories (categoryName: catName, imageId: id, catIdNumber: catIdNumber, imageUrl: result) 
          vc.cats.append(categories) 
         } 
          } 
        } 
        dispatch_async(dispatch_get_main_queue()) { 
         vc.displayCatName() 

       } 

      } 
+0

Pourquoi avez-vous besoin d'utiliser 'dispatch_async' lorsque vous êtes déjà dans un bloc de completionHandler asynchrone? –

+0

Hmm vous avez un point. Alors devrais-je simplement supprimer l'envoi? – Slygoth

+0

Oui, car cela ne sert à rien. – FredLoh

Répondre

0

La raison est parce que l'appel que vous faites est asynchrone dans la nature. Au lieu de cela, envisagez d'utiliser un gestionnaire d'achèvement.

func getArticleInfo(Id: String, success: (String) -> Void) { 
    let url = "www.Test.com" 
    Alamofire.request(.GET, url).responseJSON { response in 
     switch response.result { 
     case .Success: 
      if let value = response.result.value { 
        let json = JSON(value) 
        let singleAsset = json["url"].string 
        success(singleAsset!) 
      } 
     case .Failure(let error): 
      print(error) 
      success("TEST") 
     } 
    } 
} 

Pour appeler:

getArticleInfo("test") { (asset) -> Void in 
     print(asset) 
} 
+0

J'ai essayé le gestionnaire d'achèvement – Slygoth

+0

Le code que j'ai fourni ne fonctionnait pas? – FredLoh

+0

Non, il n'a pas. Pour quelque raison – Slygoth