I'm new in swift and I'm struggling trying to understand how to use DispatchQueue
to make a network request. Here's what a have so far:
Network Request with a function request
:
class NetworkRequest {
var host: String = "http://192.168.2.115/moodle"
func request(endpoint: String,
parameters: [String: String],
handler: @escaping (Result<Data, Error>) -> Void) {
guard let url = URL(string: host + endpoint) else {
handler(.failure(NetworkError.badURL))
return
}
var items = [URLQueryItem]()
var request = URLRequest(url: url)
var componentes = URLComponents()
for (name, value) in parameters {
items.append(URLQueryItem(name: name, value: value))
}
componentes.queryItems = items
let query = componentes.query?.data(using: .utf8)
request.httpBody = query
request.httpMethod = "POST"
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
DispatchQueue.main.async {
guard let serverResponse = response as? HTTPURLResponse, (200...299).contains(serverResponse.statusCode) else {
handler(.failure(NetworkError.badResponse))
return
}
if let serverError = error {
handler(.failure(serverError))
return
}
if let serverData = data {
handler(.success(serverData))
return
}
}
}
task.resume()
}
}
My getCoursesList
which returns an array of Courses
func getCoursesList() -> [Course] {
let networkRequest = NetworkRequest()
let token = UserDefaults.standard.string(forKey: "Token")!
var coursesList = [Course]()
networkRequest.request(endpoint: "/webservice/rest/server.php", parameters: ["wstoken": token, "wsfunction": "core_course_get_courses", "moodlewsrestformat": "json"]) { (result) in
switch result {
case .success:
do {
if let decode = try? JSONDecoder().decode([Course].self, from: result.get()) {
coursesList = decode
} else {
let error = try JSONDecoder().decode(ErrorResponse.self, from: result.get())
print(error)
}
}
catch {
print(error.localizedDescription)
}
case .failure(let error):
print(error.localizedDescription)
}
}
return coursesList
}
My problem is when I call te getCoursesList
anywhere else, the result is em empty array. If printed inside the switch block, the expected result is decoded. How can I fix this?