2017-01-12 3 views
0

Я очень новичок в быстром, поэтому, вероятно, у меня будет много ошибок в моем коде, но то, что я пытаюсь достичь, - это отправить запрос GET на сервер с параметрами внутри функции. Я хочу использовать массив, который я получаю с сервера в моей viewdidload и в других функциях, но, похоже, не нашел способ хранения массива, поэтому я могу его использовать. в моей функции она заполнена, но из моей функции она пустакак я могу получить массив из функции запроса GET в функции viewdidload в swift

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

Заменить этот запрос уага линии = 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)") –

+0

в Swift мы просто используйте «\\ (varName)», чтобы получить значение переменной. »« + varName не используется в Swift для добавления значения –

ответ

0

Ваша «проблема» в том, что вы пытаетесь получить данные с сервера, а это означает, что вы делаете сетевой вызов.

Теперь ... вы не знаете как долгое время, когда сетевой вызов будет выполняться при его запуске, если вы находитесь в хорошей сети, тогда это может быть быстро, но если вы находитесь в сети 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) 
    } 
} 

Надеюсь, что имеет смысл и поможет вам.