闭包内部循环的JSON问题

时间:2018-09-04 04:39:47

标签: json swift loops closures

我必须从几个不同的网站终结点提取JSON数据,以便获得我正在使用的对象的完整视图。为了做到这一点,我正在使用下面的downloadJSON代码。这行得通,除非每当我在downloadJSON(){}中创建一个for循环时,循环中的迭代次数似乎都乘以端点数组中的计数。

例如,由于dataSet1中有5个对象,因此我希望array1的长度为15,而不是长度5。

您能否解释一下为什么会发生这种情况,以及可以采取什么措施来纠正此问题?另外,我在downloadJSON(){}中进行了很多数据操作,因此,如果那是错误的地方,那将对您有所帮助。

下面是我正在使用的代码的通用版本。

谢谢。

import UIKit

class CustomTabBar: UITabBarController {

let website = "https://www.website.com/"
let endpoints = ["endpoint1","endpoint2","endpoint3"]
var objects = ["obj1,obj2,obj3,obj4,obj5"]

var dataSet1 = [Struct1]()
var dataSet2 = [Struct1]()
var dataSet3 = [Struct1]()

var array1 = [Int]()

override func viewDidLoad() {
    super.viewDidLoad()

    let tab1 = OverallViewController(nibName: "OverallViewController", bundle: nil)
    tab1.tabBarItem = UITabBarItem(title: "Overall", image: UIImage(named: "overallIcon"), tag: 1)

    viewControllers = [tab1]

    downloadJSON() {

        for i in 0..<self.dataSet1.count {
                self.array1.append(i)
        }

        tab1.dataSet1 = self.dataSet1
        tab1.dataSet2 = self.dataSet2
        tab1.dataSet3 = self.dataSet3
        tab1.array1 = self.array1

        tab1.overallView.reloadData()
    }
}

func downloadJSON( completed:@escaping ()->()){

    var data1 = [Struct1]()
    var data2 = [Struct1]()
    var data3 = [Struct1]()

    for j in 0..<objects.count {
    for i in 0..<endpoints.count {

        guard let qurl = URL(string: website + endpoints[i] + objects[j]) else { return }
        URLSession.shared.dataTask(with: qurl) { (data, response, error) in
            if error == nil {
                do{
                    switch i {
                    case 0:
                        data1 = try JSONDecoder().decode([Struct1].self, from: data!)
                        self.dataSet1 = data1 + self.dataSet1
                    case 1:
                        data2 = try JSONDecoder().decode([Struct1].self, from: data!)
                        self.dataSet2 = data2 + self.dataSet2
                    default:
                        data3 = try JSONDecoder().decode([Struct1].self, from: data!)
                        self.dataSet3 = data3 + self.dataSet3

                    }
                    DispatchQueue.main.async{ completed() }
                } catch { print("JSON Error") }
            }
            }.resume()
        }
    }
}
}

0 个答案:

没有答案