Ios 无法将数据传递给viewdidload、Swift
我通过alamofire从Web服务器请求数据。我想将数据传递给viewdidload,但viewdidload中的数据为空,请帮助我解释。谢谢,很抱歉我的英语。这是我的密码Ios 无法将数据传递给viewdidload、Swift,ios,json,swift,alamofire,Ios,Json,Swift,Alamofire,我通过alamofire从Web服务器请求数据。我想将数据传递给viewdidload,但viewdidload中的数据为空,请帮助我解释。谢谢,很抱歉我的英语。这是我的密码 class LiveScoreViewController: UIViewController { var matchData : JSON! = [] func loadLiveScore(section: String){ DNService.getLiveScore(section) { (JSON
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
}}
如果
DNService.getLiveScore
是一个webservice调用,那么您将无法在viewDidLoad中获取匹配数据,因为webservice调用将需要一些时间才能完成,您试图对匹配数据执行的任何操作都应该在DNService.getLiveScore
的完成块中完成
如果您愿意,您可以在
viewDidLoad
中的loadLiveScore
之后以及在completion块中放置一条print语句,您将看到print语句的执行顺序与您所期望的不同如果DNService。getLiveScore
是一个webservice调用,然后,您将无法在viewDidLoad中获取matchData,因为webservice调用将需要一些时间才能完成,您尝试对matchData执行的任何操作都应该在DNService.getLiveScore的完成块中完成
如果需要,您可以在viewDidLoad
中的loadLiveScore
之后以及在完成块中放置一条print语句,您将看到print语句的执行顺序与您期望的不同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"]
}
}}
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"]
}
}}
您的view Dod load print语句将首先调用,然后在一段时间后响应将出现,然后只有self.matchData有其他方式的数据它是空的您的view Dod load print语句将首先调用,然后在一段时间后响应将出现,然后只有self.matchData有其他方式的数据它是空的如果我在外部打印self.matchDataloadLiveScore(“LiveScore”){handled in…}仍然是空的。为什么?因为在下载之前,竞争打印语句被执行,但当您将其放在loadLiveScore方法下,然后在完成下载执行打印语句之后。@shuuichiakai您对异步编程缺乏基本的理解,去看看这里,你就会明白为什么了。如果我在loadLiveScore(“LiveScore”){handled in….}之外打印self.matchData,它仍然是空的。为什么?因为在下载之前,Competite print语句被执行,但当您将它放在loadLiveScore方法下,然后在完成下载后,执行print语句。@shuuichiakai您缺少对异步编程的基本理解,请查看此处,您将了解原因。