我看过或读过的关于Swift 3 JSON解析的所有教程都包括将JSON解析代码放在viewDidLoad()
func/method中,它工作得很好。我想把JSON解析代码放在它自己的函数中,并从viewDidLoad()
调用它。检查下面的例子:
class ViewController: UIViewController {
var ArrayImages = [String]();
override func viewDidLoad() {
super.viewDidLoad()
var json = ParseJson();
print("My Array = (ArrayImages)");
}
// NEW FUNCTION
func ParseJson() {
let url = URL(string: "http://etasawoq.com/go_categories.php")!
URLSession.shared.dataTask(with: url) { (data, response, error) in
if (error != nil){
print("Error Found Creating URLSession : (error)")
} else {
if let ParsedJson = data {
do {
let json = try JSONSerialization.jsonObject(with: ParsedJson, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSArray
for x in json {
let row = x as! NSDictionary;
let imageUrl = row["image_url"] as! String
self.ArrayImages.append(imageUrl);
}
} catch {
print("Json Processing failed (error)");
}
}
}
}.resume() // start session
}
}
不幸的是,当调用ParseJson
函数时,"ArrayImages"没有被填充。打印输出为"My Array =[]"。为什么呢?如何解决这个问题,同时保持JSON解析代码在一个单独的函数?
您的响应通过块,因此您需要在块的一侧打印数组,而不是像下面这样在外部。
do {
let json = try JSONSerialization.jsonObject(with: ParsedJson, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSArray
for x in json {
let row = x as! NSDictionary;
let imageUrl = row["image_url"] as! String
self.ArrayImages.append(imageUrl);
}
print("My Array = (ArrayImages)");
}