如何用计数器多次调用 dataTask 方法?

How to call dataTask method several times with a counter?

我目前正在使用 SwiftUI 开发应用程序。

我想用 while 方法、标志和计数器多次调用 dataTask 方法。

但是我的代码不起作用...

如何解决这个问题?


这是我的代码:

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

正如我在评论中所写,你需要一个循环和 DispatchGroup。另一方面,你不需要 flagcounter 实际上甚至不需要 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)
    }
}