循环 Json 链接 Swift
Loop Json Links 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 链接 1 :
{
"id": 88
}
Json 链接 2 :
{
"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()
}
}
您应该使用由 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)
}
保证调用顺序的唯一方法是在上一个调用的回调中进行下一个调用。这将适用于几个链接,但不能很好地概括。如果数字变化并保持相对较小,您可以制作一个有序的 "links to call" 列表并在每个回调中处理它直到它为空。
我有一个包含两个链接的数组,我想在其中获取 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 链接 1 : { "id": 88 }
Json 链接 2 : { "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()
}
}
您应该使用由 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)
}
保证调用顺序的唯一方法是在上一个调用的回调中进行下一个调用。这将适用于几个链接,但不能很好地概括。如果数字变化并保持相对较小,您可以制作一个有序的 "links to call" 列表并在每个回调中处理它直到它为空。