JSON проблема с зацикливанием внутри закрытия - PullRequest
0 голосов
/ 04 сентября 2018

Мне нужно получить данные JSON с нескольких разных конечных точек веб-сайта, чтобы получить полное представление об объектах, с которыми я работаю. Для этого я использую код downloadJSON ниже. Это работает нормально, за исключением того, что всякий раз, когда я создаю цикл for в downloadJSON () {}, количество итераций в цикле, похоже, умножается на количество в массиве конечных точек.

Например, я получаю длину 15 для массива1, а не длину 5, чего я и ожидал, поскольку в dataSet1 есть 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()
        }
    }
}
}
...