#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)
}
}