在其自己的单独函数中解析 JSON 不起作用
Posted
技术标签:
【中文标题】在其自己的单独函数中解析 JSON 不起作用【英文标题】:JSON parsing in its own separate function is not working 【发布时间】: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 假设涉及表视图,请确保在主队列上完成调用。
【参考方案1】:
您的响应通过了块,因此您需要在块内部而不是外部打印数组,如下所示。
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)");
【讨论】:
我之前尝试过,我知道它是这样工作的,但后来我想在 viewDidLoad() 中执行一些操作,比如更新标签甚至填充图像的 collectionView。你的方法行不通,因为一旦 .resume() 被击中,数组就会再次为空。 是的,但在各个方面你都会遇到这个问题。但是你得到回应后想做什么。 假设用来自 json url 的演员名称填充 tableView 这是最后一次成功回调,因此您可以在此处填充您的表格视图。使用此答案尝试一次。以上是关于在其自己的单独函数中解析 JSON 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
解析 JSON 对象时 JSONSerilazation 不起作用
使用 pyspark 解析 JSON 时嵌套动态模式不起作用