如何处理Swifty JSON Alamofire请求中的优先级



我如何在Javascript中使用dispatchQueue或类似"await"的东西来返回self.arrayData中的值(因为循环的末尾在前一个内容之前运行(。我习惯了R和Python中的代码逐行运行,Swift中最好采用什么行为?

以下是功能:

func fetch2(){
var i:Int = 0
repeat {
AF.request(itemLookUp[i]).validate().responseJSON { response in
switch response.result {
case .failure(let error):
print("(error) in fetch2")
case .success(let value):
let json = JSON(value)
//Extract the Matiere for ML Extraction
self.matiereInput = json["ResultSet"]["0"]["Result"]["0"]["SpAdditional"].string ?? "none"
let energyCheck:Bool = self.matiereInput.contains("エネルギー") //energy-kcal
if energyCheck==true && self.arrayData[0]==0.0{
//regular expression
var patEnergy = #"(エネルギー)(([^d]+)(d+)(.)(d+)|([^d]+)(d+))"# //avoid the repetition of the pattern within the same matiereinput
let patEnergy2 = self.matches(for: patEnergy, in: self.matiereInput)
patEnergy = patEnergy2.joined(separator:"")
let valueEnergy = self.matches(for: self.regex2, in: patEnergy)
self.arrayData[0] = Double(valueEnergy.joined(separator: "")) ?? 0.0
}
}
}
i = i+1
print(self.arrayData[0])
} while i <= (self.returned-1)
}

提前谢谢!

标准模式是notifyDispatchGroup,然后使用完成处理程序异步通知调用者结果:

func fetchAll(completion: @escaping (Result<[Double], Error>) -> Void) {
let group = DispatchGroup()
var results: [Double] = []
var errors: [Error] = []
for item in lookupItems {
group.enter()                                          // enter before request
AF.request(item).validate().responseJSON { response in
defer { group.leave() }                            // leave when this closure is done
switch response.result {
case .failure(let error):
errors.append(error)
case .success(let value):
let result = ...
results.append(result)
}
}
}
group.notify(queue: .main) {
if let error = errors.first {                          // I don’t know what you want to do if there were multiple errors, so for now I’ll just grab the first one
completion(.failure(error))
} else {
completion(.success(results))
}
}
}

然后你会这样使用它:

fetchAll { result in
switch result {
case .failure(let error):
print(error)
case .success(let values):
print(values)
}
}

现在,我无法对您尝试做的事情进行逆向工程(您似乎在每次迭代中都在更新self.arrayData[0]!(,所以我只返回了一个Double数组。但是,您显然可以更改results的类型和completion闭包的参数,以匹配与您的情况相关的任何内容。

但不要迷失在上面例子的细节中,而是只关注几个关键的观察结果:

  1. 提供完成处理程序闭包,以便在完成所有请求时调用
  2. 使用DispatchGroup跟踪所有请求何时完成
  3. 为您的DispatchGroup提供一个notify闭包,当所有group.enter()调用被其各自的group.leave()调用偏移时,该闭包将被调用
  4. 一个更微妙的观察结果是,您应该避免从responseJSON块中更新属性。在异步代码中,如果可能的话,您确实希望将交互限制为局部变量。将结果返回到completion闭包中(调用方可以根据自己的意愿更新模型和UI(

最新更新