Ваша «проблема» в том, что вы пытаетесь получить данные с сервера, а это означает, что вы делаете сетевой вызов.
Теперь ... вы не знаете как долгое время, когда сетевой вызов будет выполняться при его запуске, если вы находитесь в хорошей сети, тогда это может быть быстро, но если вы находитесь в сети 3G, это может потребоваться какое-то время.
Если вызов вашего сервера был выполнен синхронно, результатом будет то, что каждый раз, когда вы пытаетесь извлечь данные, ваш код будет сосредоточен на том, чтобы делать именно это, что означает, что больше ничего не будет продолжаться ... что не то, что вы хотите :)
Вместо этого, когда вы используете URLSession
и вызываете task.resume()
, этот метод выполняется асинхронно, что означает, что он начинается с другого потока в фоновом режиме, где он будет извлекать данные.
А пока ваш основной поток может обрабатывать визуализацию пользовательского интерфейса и так далее. В какой-то момент в ближайшем будущем ваш сетевой вызов будет завершен, и теперь у вас будут действительные данные и вы должны сообщить всем, кто должен знать.
Итак, когда вы делаете вызов dataTask(with: completionHandler:), что вы на самом деле сказать, что-то вдоль линий:
«эй ... сходить за эти данные в фоновом режиме, пожалуйста, а когда вы закончите, Я хотел бы выполнить код, который я передал вам здесь, в 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
заселяться еще в качестве task
занят выборки, что данные в фоновом режиме.
Итак ... что вам нужно сделать, так как @vadian говорит, чтобы обновить пользовательский интерфейс после того, как данные были неправдоподобным, смысл, в 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)")
//Now you have data, reload the UI with the right scenarioArray
}
} catch let error as NSError {
print(error.localizedDescription)
}
}
Надеюсь, что имеет смысл и поможет вам.
пытается добавить, что данные в массиве –
Заменить этот запрос уага линии = URLRequest (URL: URL (строка: «http://dtsl.ehb.be/app&web/ios_php/getAllScenariosByPersoon.php?persoonID="+idPersoon !)) С запроса вар = URLRequest (URL: URL (строки: "http://dtsl.ehb.be/app&web/ios_php/getAllScenariosByPersoon.php?persoonID=\\(idPersoon)") –
в Swift мы просто используйте «\\ (varName)», чтобы получить значение переменной. »« + varName не используется в Swift для добавления значения –