【问题标题】:Alamofire synchronous request with a loop带循环的 Alamofire 同步请求
【发布时间】: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 来强制函数以正确的顺序附加响应。那是行不通的。任何的想法?谢谢!

【问题讨论】:

    标签: json swift request alamofire


    【解决方案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 和回调函数。我只有两个功能。这是链接:stackoverflow.com/questions/62470476/…
    猜你喜欢
    • 2016-08-19
    • 1970-01-01
    • 2018-11-11
    • 2018-05-22
    • 2016-04-09
    • 1970-01-01
    • 2017-11-22
    • 2017-02-19
    相关资源
    最近更新 更多