Как получить уведомление после зацикливания запросов Alamofire с помощью DispatchQueue в Swift? - PullRequest
1 голос
/ 15 марта 2020

У меня есть этот код, чтобы получить список идентификаторов и имен, которые анализируются с JSON посредством итерации вызовов.

Проблема в том, что я не знаю, как получить уведомление, простую печать («закончил»), сделал бы. Я пытался использовать команду печати после 'for' l oop, но он также повторяется.

У кого-нибудь есть идеи?

Вот код:

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

            }
        }
    }
}

1 Ответ

1 голос
/ 17 марта 2020

Сетевой запрос должен выполняться не в основном потоке, а в фоновом, syn c или asyn c. Основной поток зарезервирован только для пользовательского интерфейса, за исключением случаев, когда вы хотите принудительно заблокировать интерфейс пользователя. Вы можете использовать Dispatch Group и DispatchQueue, чтобы организовать свой код и уведомление после завершения. Тот же результат может быть достигнут с 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")
})

Надеюсь, это поможет.

...