【发布时间】:2016-11-10 06:07:46
【问题描述】:
我看过或读过的所有关于 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”。打印输出是“我的数组 = []”。这是为什么?如何在将 JSON 解析代码保留在单独的函数中的同时解决此问题?
【问题讨论】:
-
你的
ParseJson方法正在进行异步调用,所以它在后台执行,所以print("My Array = \(ArrayImages)");在dataTask(with:)的完成块之前执行 -
即使您的代码都在
viewDidLoad中,您的代码也会有完全相同的问题。 -
那这个问题怎么解决呢?图片我想用演员的名字填充一个 tableView。我如何使用我当前的代码风格来实现这一点?
-
@Aboodnet 为此,只需在 for 循环之后重新加载您的 Tableview
tableview.reloadData()。 -
@NiravD 假设涉及表视图,请确保在主队列上完成调用。