2016-05-22 4 views
-2

Метод не возвращает значение, полученное из запроса GET, где переменная res может быть напечатана в разделе задач, но в конце не возвращается.мое быстрое приложение не возвращает значение словаря

func lookUpTheWord(word:String) -> NSDictionary { 
    var res = NSDictionary() 
    let urlString = "https://wordsapiv1.p.mashape.com/words/" + word 
    if let url = NSURL(string:urlString) { 
     let request = NSMutableURLRequest(URL: url) 
     request.HTTPMethod = "GET" 
     request.addValue("this is a key", forHTTPHeaderField: "X-Mashape-Key") 
     request.addValue("application/json", forHTTPHeaderField: "Accept") 

     let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { 
      data, response, error in 
      if error != nil { 
       print("\(error)") 
       return 
      } 
      res = self.toJson(data!) 
      print(res) //it works here 
     } 
     task.resume() 
    } 
    return res //res becomes nil 
} 
+1

Возможный дубликат [Swift: Как вернуть значение в асинхронной функции urlsession] (http://stackoverflow.com/questions/27081062/быстроногих, как-делать-я-возврат-а-значение-в пределах-ан-асинхронно-urlsession-функция) –

ответ

1

Это потому, что вы возвращаете переменную res до ее назначения. Вы заметите, что res, который не является нолем, печатается после того, который после него. Это связано с тем, что HTTP-запрос не происходит мгновенно - код после его выполнения до его завершения, поэтому он называется «асинхронным».

Если вы хотите использовать переменную, полученную в HTTP-запросе, используйте закрытие в качестве параметра в своей функции и вызовите его, когда запрос будет завершен. Пример:

func lookUpTheWord(word:String, completion: (NSDictionary->Void)) { 
    var res = NSDictionary() 
    let urlString = "https://wordsapiv1.p.mashape.com/words/" + word 
    if let url = NSURL(string:urlString) { 
     let request = NSMutableURLRequest(URL: url) 
     request.HTTPMethod = "GET" 
     request.addValue("this is a key", forHTTPHeaderField: "X-Mashape-Key") 
     request.addValue("application/json", forHTTPHeaderField: "Accept") 

     let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { 
      data, response, error in 
      if error != nil { 
       res = self.toJson(data!) 
       completion(res) 
      } 
     } 
     task.resume() 
    } 
} 

Используется так:

lookUpTheWord("word") { res in 
    print(res) 
} 
Смежные вопросы