Запустить несколько URLRequest в цикле for, выполнить один после завершения предыдущего

В моем приложении у меня есть задача, в которой пользователь будет вводить дату и время, а URL-адрес будет извлекать данные. Каждый URL-адрес будет возвращать с сервера строку JSON большого размера.

Проблема возникает, когда пользователь вводит больший интервал дат, из-за чего сервер зависает. В версии приложения для Android я использовал AsyncTask для этого. В этом я разделяю запросы на несколько, если пользователь вводит большой интервал дат. Я использую цикл for для получения данных за каждый день и публикую прогресс в onProgressUpdate после выполнения задачи каждого дня.

В Swift также мне нужно использовать несколько задач данных в цикле for и публиковать результаты.

for i in 0 ..< dates.count {
   // Getting response from server //
   let response = getResponse(imei: sImei, date: dates[i])
   parseResponse(response)
}

Вот как я планировал это сделать. Но не знаю, как это реализовать.

Я видел несколько предложений по использованию DispatchGroup. Я не знаком с этим. Поэтому, пожалуйста, помогите мне выполнить мою задачу.

Примечание. Указание большого интервала дат в одном dataTask задушит мой сервер. Потому что это слабый сервер. Поэтому я должен запрашивать данные для отдельных дат и объединять их.


person Praveen Kumar    schedule 12.09.2017    source источник
comment
прочитайте этот пост stackoverflow.com/questions /42484281/. Это может помочь вам.   -  person Usman Javed    schedule 12.09.2017
comment
Ваши запросы не зависят друг от друга, верно? Если вы не используете результаты одного запроса, прежде чем отправить следующий, вам лучше запускать их одновременно и не ждать завершения запроса перед запуском следующего.   -  person Dávid Pásztor    schedule 12.09.2017


Ответы (2)


Используйте рекурсию: изначально i = 0 .

 func callApi( i : Int){

    if(dates.count > i){

   // After Getting response from server //

        self.callApi(i: i + 1)

 }

}
person yogesh wadhwa    schedule 12.09.2017

Попробуйте сделать цикл для генерации NSBlockOperation и использовать addDependency для предыдущей операции.

var prevOperation
for i in 0 ..< dates.count {

    var operation = NSBlockOperation() {
        // Getting response from server //
        let response = getResponse(imei: sImei, date: dates[i])
        parseResponse(response)
    }

    if(i>0) {
        operation.addDependency(prevOperation)
    }
    prevOperation=operation;
}
person Mohamed Adly    schedule 12.09.2017