我必须从几个不同的网站终结点提取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()
}
}
}
}