带循环的 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 同步请求的主要内容,如果未能解决你的问题,请参考以下文章

如何在 alamofire 中同步上传图片?

使用 Alamofire 的同步请求

如何正确使用信号灯同步 Alamofire 请求 Swift4 的主线程?

循环中使用同步请求

不带搜索框,数据同步请求,产品按字母分组组件

for循环axios,同步请求,构建Echarts表格