【问题标题】:JSON parsing in its own separate function is not working在其自己的单独函数中解析 JSON 不起作用
【发布时间】: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 假设涉及表视图,请确保在主队列上完成调用。

标签: ios json parsing swift3


【解决方案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
  • 这是最后一次成功回调,因此您可以在此处填充您的表格视图。使用此答案尝试一次。
猜你喜欢
  • 2015-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-26
  • 1970-01-01
相关资源
最近更新 更多