Как вызвать метод dataTask несколько раз со счетчиком?

#swift #swift5

#swift #swift5

Вопрос:

В настоящее время я разрабатываю приложение с использованием SwiftUI.

Я хочу вызвать dataTask метод несколько раз с while помощью метода, флага и счетчика.

Но мой код не работает…

Как можно решить эту проблему?


Вот мой код:

 func makeCallWithCounter(){
        
        var counter = 0
        var flag = false
        
        // Set up the URL request
        let endpoint: String = "https://sample.com/api/info/"
        
        guard let url = URL(string: endpoint) else {
            print("Error: cannot create URL")
            return
        }
        var urlRequest = URLRequest(url: url)
        // set up the session
        let config = URLSessionConfiguration.default
        let session = URLSession(configuration: config)
        
        // make the request
        let task = session.dataTask(with: urlRequest) {
            (data, response, error) in
            // parse the result as JSON, since that's what the API provides
            DispatchQueue.main.async {
                do{ self.sample = try JSONDecoder().decode([Sample].self, from: responseData)
                    
                    counter  = 1
                    
                    if counter > 4 {
                        flag = true
                    }
                }catch{
                    print("Error: did not decode")
                    return
                }
            }
        }
        while flag == false {
            task.resume()
        }
    }
  

ОБНОВЛЕНО

 func makeCallWithCounter(){

var day = 1
var date = "2020-22-(day)"
var totalTemperature = 0
var counter = 0
var flag = false

// Set up the URL request
let endpoint: String = "https://sample.com/api/info/?date=(date)"

guard let url = URL(string: endpoint) else {
    print("Error: cannot create URL")
    return
}
var urlRequest = URLRequest(url: url)
// set up the session
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)

// make the request
let task = session.dataTask(with: urlRequest) {
    (data, response, error) in
    // parse the result as JSON, since that's what the API provides
    DispatchQueue.main.async {
        do{ self.sample = try JSONDecoder().decode([Sample].self, from: responseData)
            
            day  = 1
            totalTemperature  = self.sample.temperature
            
            if day > 4 {
                flag = true
            }
        }catch{
            print("Error: did not decode")
            return
        }
    }
 }
while flag == false {
    task.resume()
 }
print(totalTemperature)
}
  

Xcode: версия 12.0.1

Комментарии:

1. Код выполняет задачу один раз, flag и счетчик не имеет никакого эффекта. Чтобы выполнить задачу несколько раз, вам нужен цикл и DispatchGroup . И какова цель многократного вызова одного и того же URL-адреса?

2. @vadian, я обновил свой код, в качестве нового кода я хочу вызывать метод, используя каждый раз другой URL-адрес в while roop. итак, если я вызываю только DispatchGroup , это работает не так, как я хочу, правильно?

Ответ №1:

Как я уже писал в комментариях, вам нужен цикл и DispatchGroup . С другой стороны, вам не нужно flag , counter и на самом деле даже не URLRequest

Я удалил избыточный код, и все еще есть серьезная ошибка: строка

 totalTemperature  = sample.temperature
  

не может работать, если sample это массив. Вопрос содержит недостаточно информации, чтобы это можно было исправить.

 func makeCallWithCounter() {
    
    var totalTemperature = 0
    let group = DispatchGroup()
    for day in 1...4 {
        // Set up the URL request
        let endpoint = "https://sample.com/api/info/?date=2020-22-(day)"
        
        guard let url = URL(string: endpoint) else {
            print("Error: cannot create URL")
            continue
        }
        
        // make the request
        group.enter()
        let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
            defer { group.leave() }
            if let error = error { print(error); return }
            // parse the result as JSON, since that's what the API provides
            do {
                let sample = try JSONDecoder().decode([Sample].self, from: data!)
                totalTemperature  = sample.temperature
            } catch {
                print(error)
            }
        }
        task.resume()
    }
    
    group.notify(queue: .main) {
        print(totalTemperature)
    }
}