2016-03-16 3 views
0

Я запросил данные с веб-сервера alamofire. Я хочу передать данные в viewdidload, но данные в viewdidload пустые, пожалуйста, помогите мне объяснить. спасибо и сори за мой английский. это мой кодне может передавать данные на viewdidload, Swift

class LiveScoreViewController: UIViewController 
{ 
    var matchData : JSON! = [] 

func loadLiveScore(section: String){ 
    DNService.getLiveScore(section) { (JSON) ->() in 
     self.matchData = JSON[ ] 

     self.matchData = self.matchData["match"] 
     //print(self.matchData) -> is ok 
    } 
} 


override func viewDidLoad() { 
    super.viewDidLoad() 

    loadLiveScore("LiveScore") 

    //print(self.matchData) -> is empty 

}} 
+0

Ваше мнение сделал нагрузки оператор печати будет звонить первой, а затем через некоторое время ответ придет только тогда self.matchData есть данные другие мудрые пустые – Jaimish

ответ

3

Если DNService.getLiveScore является вебсервис вызов, то вы не сможете получить matchData внутри viewDidLoad, поскольку вызов вебсервис займет некоторое время, чтобы закончить все, что вы пытаетесь сделать с matchData должны быть сделано в завершении блока DNService.getLiveScore скорее всего

Если вы хотите, вы можете поместить оператор печати сразу после loadLiveScore в viewDidLoad, а также в блоке завершения, и вы увидите, порядок выполнения заявлений печати не что вы ожидаете

1

getLiveScore - асинхронный метод. Таким образом, вы должны использовать обработчик завершения, чтобы получить ответ. Сделайте обработчик для loadLiveScore

func loadLiveScore(section: String), handler: (JSON) ->()) { 

    DNService.getLiveScore(section) { (JSON) ->() in 

     handler(JSON) 

    } 
} 

вызвать метод из вашего viewDidLoad, как, как:

override func viewDidLoad() { 
    super.viewDidLoad() 

    loadLiveScore("LiveScore") { json in 

     print(json) // parse JSON as you need 

     self.matchData = json["match"] 
    } 
}} 
+0

если я печатаю self.matchData за пределами loadLiveScore («LiveScore») {обработан в ....}, он по-прежнему пуст .why? – shuuichiakai

+0

Потому что до того, как загружен конкурирующий оператор печати, будет выполнен, но когда вы поместите его под метод loadLiveScore, то после завершения загрузки выполните инструкцию печати. – iMuzahid

+0

@shuuichiakai вам не хватает фундаментального понимания асинхронного программирования, идите посмотреть здесь, и вы поймете, почему. http://www.i-programmer.info/programming/theory/6040-what-is-asynchronous-programming.html – sbarow

Смежные вопросы