【问题标题】:How to get notified after looping through Alamofire requests using DispatchQueue in Swift?在 Swift 中使用 DispatchQueue 循环 Alamofire 请求后如何获得通知?
【发布时间】:2020-06-27 00:20:11
【问题描述】:

我有这段代码来获取通过调用迭代从 JSON 解析的 id 和名称列表。

问题是我不知道如何获得通知,简单的 print("finished") 就可以了。我尝试在“for”循环之后使用打印命令,但它也会迭代。

有人知道吗?

代码如下:

override func viewDidLoad() {
    super.viewDidLoad()

    //Manager
    let manager = SessionManager.default.startRequestsImmediately = false

    //País
    let paisRequest = Alamofire.request(self.cadastro_pais_url, method: .post, parameters: self.cadastro_pais_params).responseString { response in

        do { } catch { print("error") }
    }

    for i in 0...2000 {
        DispatchQueue.main.async {

            let patrocinadorRequest = Alamofire.request(self.buscaPatrocinador, method: .post, parameters: ["patrocinador":"\(i)"]).responseJSON { (responseData) -> Void in
                if((responseData.result.value) != nil) {
                    let swiftyJsonVar = JSON(responseData.result.value!)

                    if !(swiftyJsonVar["integracao"] == JSON.null){
                        print("\(swiftyJsonVar["integracao"]),\(swiftyJsonVar["nome"]),")

                    } else {}
                } else {
                    print("Error")
                }
            }

            //Requests Chain
            let chain = RequestChain(requests: [paisRequest, patrocinadorRequest])
            chain.start { (done, error) in

            }
        }
    }
}

【问题讨论】:

  • 尝试使用 CodyFire lib 会好很多github.com/MihaelIsaev/CodyFire
  • 我不确定这是否是一种不好的做法。但是由于你的 for 循环中有硬编码的值,你可以检查 'if i == 2000'。但不确定是否建议这样做。我会用另一种方法解决这个问题(并在 viewDidLoad 中使用尽可能少的代码),然后使用“@escaping”块。在'DispatchQueue.main.async'中我会返回方法
  • 我建议您不要以这种方式创建请求,尤其是在使用 Alamofire 4 时,因为 Alamofire 4 在这样使用时会出现缩放问题。相反,您应该一次将您的请求分成可能 6 个的批次,并在其他请求完成时运行您的其他请求。

标签: swift for-loop request alamofire dispatch-async


【解决方案1】:

网络请求不应在主线程上完成,而应在后台同步或异步上完成。主线程只保留给 UI 的东西,除非你想强制阻塞用户界面。 您可以使用Dispatch GroupDispatchQueue 来组织您的代码和完成后的通知。使用Semaphore...

可以实现相同的结果

示例:

let dispatchGroup = DispatchGroup()
// change the quality of service based on your needs
let queue = DispatchQueue(label: "com.stackoverflow", qos: .background)

for i in 0...2000 {
  dispatchGroup.enter()
  // Perform on background thread, async
  queue.async {
    Alamofire.request { response in
      dispatchGroup.leave()
      // ...
    }
  }
}

dispatchGroup.notify(queue: .main, execute: {
  print("DONE WITH ALL REQUESTS")
})

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    相关资源
    最近更新 更多