我如何在swift

时间:2017-01-12 12:44:52

标签: ios arrays json swift get

我对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()
}

1 个答案:

答案 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

希望这有意义并帮助你。