Loop Json Ссылки Swift
У меня есть массив с двумя ссылками, где я хочу получить значение id
, Код работает но device_id_array
варьируется между [88.0, 89.0] and [89.0, 88.0]
и я не знаю, как это исправить. Спасибо за вашу помощь.
override func viewDidLoad() {
super.viewDidLoad()
device_link_array = ["http://link1.com", "http://link2.com"]
for link in device_link_array {
let url = URL(string: link)
let task = URLSession.shared.dataTask(with: url!) { data, response, error in
if error != nil
{
print("Error")
}else{
if let content = data{
do{
let json = try JSONSerialization.jsonObject(with: content, options: []) as! [String:Any]
if let device_id = json["id"]{
device_id_array.append(device_id as! Double)
}
print(device_id_array)
}catch{}
}
}
}
task.resume()
}
}
Json Link1: {"id": 88}
Json Link2: {"id": 89}
ОБНОВИТЬ:
device_link_array = ["http://link1.com", "http://link2.com"]
let group = DispatchGroup()
for links in device_link_array {
let url = URL(string: links)
group.enter()
let task = URLSession.shared.dataTask(with: url!) { data, response, error in
if error != nil
{
print("Error")
}
else{
if let content = data{
do{
let json = try JSONSerialization.jsonObject(with: content, options: []) as! [String:Any]
if let device_id = json["id"]{
device_id_array.append(device_id as! Double)
}
print(device_id_array)
}catch{}
}
}
group.leave()
}
task.resume()
}
}
2 ответа
Вы должны использовать массив Device
объект определяется:
class Device {
var link: String
var identifier: Double?
init(link: String) {
self.link = link
}
}
let deviceArray: [Device] = [
Device(link: "http://link1.com"),
Device(link: "http://link2.com")]
Затем вы меняете свой цикл на:
for device in deviceArray {
let link = device.link
... // URLSession stuff
if let deviceId = json["id"]{
device.identifer = deviceId as! Double
}
print(deviceArray)
...
Вы сможете получить доступ к своему первому идентификатору с помощью:
if let firstIdentifier = deviceArray[0].identifier {
print(firstIdentifier)
}
Единственный способ гарантировать порядок звонков - сделать следующий звонок в обратном вызове предыдущего. Это будет работать для пары ссылок, но не будет обобщать. Если число варьируется и остается относительно небольшим, вы можете составить упорядоченный список "ссылки на звонок" и обрабатывать его в каждом обратном вызове, пока он не станет пустым.