如何在Xcode中使用字符串API数组的for-in循环,并使用每个API链接来解析Swift中的相同JSON结构



我有一个字符串数组,其中包含API链接。这里有一个的例子

var apiLinkArray  = [String]()
apiLinkArray = ["google.com/link1", "google.com/link2" , "google.com/link3"]

我正在尝试使用一个for-in循环来取出一个API字符串并解析JSON

for count in 0...self.apiLinkArray.count-1 {
// Pre Code
let specificUrl = self.apiLinkArray[count]
URLSession.shared.dataTask(with: URL(string: specificUrl)!) {(data, response, error) in
do {
// JSON Parsing Stuff
} catch {
}
}.resume()

// Other outside code
}

我面临的问题是,for in循环将在不运行URLSession的情况下运行,然后最终它将运行URLSession。例如,循环将开始;预编码";则它到达URLSession并跳过它;其他外部代码";那么它将返回并执行URLSession。这会导致很多问题,尤其是在apiLinkArray包含40-50个API的情况下。对我来说,当它回到URLSession时,与开头的数组相比,API链接的顺序是错误的。那么,有没有一种方法,当for in循环开始时,它将执行";预编码";则带有do函数的URLSession将运行";其他外部代码";则它将再次循环改变"0";计数";到1并再次循环?谢谢

首先,URLSession.shared.dataTask应该异步执行。

如果你的期望被一个接一个地执行,那么按顺序返回,看看Swift Operationhttps://www.avanderlee.com/swift/operations/.

或者实现一个简单的解决方案:

let urls = [
URL(string: "http://apple.com/1")!,
URL(string: "http://apple.com/2")!,
]
var count = urls.count
let results = Dictionary<URL, Int>()
urls.forEach { (url: URL) in
URLSession.shared.dataTask(with: $0) { (data: Data?, response: URLResponse?, error: Error?) in
count -= 1
// Parse your own data
let result = ...
results[url] = result

guard count <= 0 { else return }
// All requests are finished
}
.resume()
}

最新更新