我对swift非常新,所以我的代码可能会有很多错误,但我想要实现的是将GET请求发送到一个函数内部带有参数的服务器。我想在我的viewdidload和其他函数中使用从服务器接收的数组,但似乎无法找到存储数组的方法,以便我可以使用它。在我的函数中它被填充,但是在我的函数中它是空的
var scenarioArray: Array<Any> = []
let idPersoon = UserDefaults.standard.object(forKey: "idPersoon") as! String
override func viewDidLoad() {
super.viewDidLoad()
ScenarioArray()
print(scenarioArray)
print(self.scenarioArray)
}
func ScenarioArray() {
var request = URLRequest(url: URL(string: "http://dtsl.ehb.be/app&web/ios_php/getAllScenariosByPersoon.php?persoonID="+idPersoon)!)
request.httpMethod = "GET"
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data, error == nil else { // check for fundamental networking error
print("error=\(error)")
return
}
do {
if let jsonResult = try JSONSerialization.jsonObject(with: data, options: []) as? NSDictionary {
self.scenarioArray = (jsonResult["Scenarios"] as! NSArray) as! Array<Any>
print("ASynchronous\(self.scenarioArray)")
}
} catch let error as NSError {
print(error.localizedDescription)
}
}
task.resume()
}
答案 0 :(得分:0)
你的问题&#34;是你试图从服务器获取数据,这意味着你正在进行网络呼叫。
现在......你不知道启动它时 网络通话的时间长,如果你在一个良好的网络上那么它可能很快,但如果你是在3G网络上可能需要一段时间。
如果对您的服务器的调用是同步完成的,那么结果就是每次您尝试获取数据时,您的代码都会专注于这样做,这意味着没有其他任何事情可以继续......这不是你想要的:)
相反,当您使用URLSession
并调用task.resume()
时,该方法是异步执行的,这意味着它在后台的另一个线程上启动,它将获取数据。
与此同时,您的主线程可以自由处理UI呈现等。在不久的将来,您的网络呼叫结束,您现在拥有有效数据,并且必须通知需要知道的任何人。
所以当你打电话给dataTask(with: completionHandler:)时,你实际上说的是:
&#34;嘿...请在后台获取这些数据,当您完成后,我想执行我在{{I}传递给您的代码{1}}使用您告诉我的参数&#34;。
希望这有点意义:)
现在......你有这段代码:
completionHandler
函数调用的最后一部分(let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data, error == nil else { // check for fundamental networking error
print("error=\(error)")
return
}
do {
if let jsonResult = try JSONSerialization.jsonObject(with: data, options: []) as? NSDictionary {
self.scenarioArray = (jsonResult["Scenarios"] as! NSArray) as! Array<Any>
print("ASynchronous\(self.scenarioArray)")
}
} catch let error as NSError {
print(error.localizedDescription)
}
}
)是{ data, response, error in...
,不会立即执行。在数据检索完成之前不会执行。
而因此当您在completionHandler
中调用ScenarioArray()
函数时,将会发生异步调用获取数据将在后台启动并且您的viewDidLoad
将继续它正在做的事情,这意味着当你说:
viewDidLoad
然后,当您的print(scenarioArray)
print(self.scenarioArray)
忙于在后台获取该数据时,您不能指望scenarioArray
已填充。
所以......正如@vadian所说,你需要做的就是在获取数据后更新你的用户界面 ,意思是task
。
completionHandler
希望这有意义并帮助你。