我试图使用以下代码在Swift中调用json网络服务,并tableview在Swift IOS中显示它。
tableview
/*declared as global*/ var IdDEc = [String]() // string array declared globally //inside viewdidload let url = NSURL(string: "http://192.1.2.3/PhpProject1/getFullJson.php") let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in let json1 = NSString(data: data!, encoding: NSUTF8StringEncoding) print("json string is = ",json1) // i am getting response here let data = json1!.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) do { let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as! NSArray for arrayData in json { let notId = arrayData["ID"] as! String self.IdDEc.append(notId) } print(" id = ",IdDEc) //here i am getting values } catch let error as NSError { print("Failed to load: \(error.localizedDescription)") } print(" id out count = ",self.IdDEc.count) //here also } print(" id out count = ",self.IdDEc.count) // not here task.resume()
我将数组IdDEc声明为全局数组,但该数组的作用域仅位于NSURLSession内,
我也想使用此数组来填充tableview。这是示例json输出文件
[ {"ID":"123" , "USER":"philip","AGE":"23"}, {"ID":"344","USER":"taylor","AGE":"29"}, {"ID":"5464","USER":"baker","AGE":"45"}, {"ID":"456","USER":"Catherine","AGE":"34"} ]
我是个新手,请帮助
这个想法是使用“回调”。
在这里,我为您想要获得的NSArray做了一个:
completion: (dataArray: NSArray)->()
我们创建一个获取数组的函数,并将此回调添加到函数的签名中:
func getDataArray(urlString: String, completion: (dataArray: NSArray)->())
数组准备就绪后,我们将使用回调:
completion(dataArray: theNSArray)
完整功能如下所示:
func getDataArray(urlString: String, completion: (dataArray: NSArray)->()) { if let url = NSURL(string: urlString) { NSURLSession.sharedSession().dataTaskWithURL(url) {(data, response, error) in if error == nil { if let data = data, json1 = NSString(data: data, encoding: NSUTF8StringEncoding), data1 = json1.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) { do { let json = try NSJSONSerialization.JSONObjectWithData(data1, options: []) if let jsonArray = json as? NSArray { completion(dataArray: jsonArray) } } catch let error as NSError { print(error.localizedDescription) } } else { print("Error: no data") } } else { print(error!.localizedDescription) } }.resume() } }
现在我们像这样使用此函数,不再有异步问题:
getDataArray("http://192.1.2.3/PhpProject1/getFullJson.php") { (dataArray) in for dataDictionary in dataArray { if let notId = dataDictionary["ID"] as? String { self.IdDEc.append(notId) } } print("id out count = ", self.IdDEc.count) }
Swift 3 更新+修复和改进。
func getContent(from url: String, completion: @escaping ([[String: Any]])->()) { if let url = URL(string: url) { URLSession.shared.dataTask(with: url) { (data, response, error) in if error == nil { if let data = data { do { let json = try JSONSerialization.jsonObject(with: data, options: []) if let content = json as? [[String: Any]] { // array of dictionaries completion(content) } } catch { // error while decoding JSON print(error.localizedDescription) } } else { print("Error: no data") } } else { // network-related error print(error!.localizedDescription) } }.resume() } } getContent(from: "http://192.1.2.3/PhpProject1/getFullJson.php") { (result) in // 'result' is what was given to 'completion', an array of dictionaries for dataDictionary in result { if let notId = dataDictionary["ID"] as? String { // ... } } }