带循环的 Alamofire 同步请求
Posted
技术标签:
【中文标题】带循环的 Alamofire 同步请求【英文标题】:Alamofire synchronous request with a loop 【发布时间】:2017-06-09 13:02:22 【问题描述】:我知道如何使用完成来发出同步请求。但我不知道如何在循环中发出同步请求。
这是我的代码:
var marks = [JSON]()
let vnCount = studentVnCodes.count
var i: Int = 0
marks = [JSON](repeating: JSON.null, count: vnCount)
for vn in studentVnCodes
let url = "https://example.com/Student/Grade/GetFinalGrades?&vn=\(vn)&academic_year=All"
Alamofire.request(url).responseString response in
var dataString: String = (response.result.value)!
dataString = cleanMarksJSON(string: dataString)
if let dict = convertToDictionary(text: dataString)
marks[i] = (JSON(dict as Any))
i += 1
if (vnCount == marks.count)
completionHandler(marks)
在这里,我尝试使用 vn 代码 (vnCount
) 的数量发出 x 个请求。
问题是我在我的 JSON marks
数组中以错误的顺序获取了所有 JSON。当然是因为它在完成时会在数组中附加响应,并且不要等待前一个请求结束。
所以我尝试创建一个变量i
来强制函数以正确的顺序附加响应。那是行不通的。任何的想法?谢谢!
【问题讨论】:
【参考方案1】:您可以在串行队列中按顺序运行您的请求,在这种情况下,它们将按照您调用它们的顺序执行,从而确保它们将按顺序添加到数组中。但是,这似乎是一个次优的解决方案,因为您会因为按顺序而不是同时运行请求而损失执行时间。
如果你还想这样实现,看下面的代码:
var marks = [JSON]()
let vnCount = studentVnCodes.count
marks = [JSON](repeating: JSON.null, count: vnCount)
let serialQueue = DispatchQueue(label: "serialQueue")
for vn in studentVnCodes
serialQueue.async
let url = "https://example.com/Student/Grade/GetFinalGrades?&vn=\(vn)&academic_year=All"
Alamofire.request(url).responseString response in
var dataString: String = (response.result.value)!
dataString = cleanMarksJSON(string: dataString)
if let dict = convertToDictionary(text: dataString)
marks.append(JSON(dict as Any))
if (vnCount == marks.count)
completionHandler(marks)
更好的解决方案是将响应存储在数据结构中,其中排序无关紧要,例如在字典中,其中您的键是索引(您将用于数组)并且您的值是JSON 响应值。这样您就可以同时运行请求并按顺序访问响应。
【讨论】:
谢谢!但是你说得对:这不是最优的。所以我找到了你给我的字典的另一种方式。我们有相同的想法! ;) @Dávid Pásztor 我可以问一个与同步相关的问题吗?实际上我没有得到一个想法? @Tekhe 你有什么问题? @DávidPásztor 谢谢。实际上,我已经按照您的回答并在我的代码中使用了,但顺序/同步它不起作用。DispatchQueue.main.async
后端它的Alamofire
和回调函数。我只有两个功能。这是链接:***.com/questions/62470476/…以上是关于带循环的 Alamofire 同步请求的主要内容,如果未能解决你的问题,请参考以下文章