35
loading...
This website collects cookies to deliver better user experience
struct User: Codable {
let name: String
let email: String
let username: String
}
// MARK: fetch users with completion handler
func fetchUsersFirstExample(completion: @escaping (Result<[User], NetworkingError>) -> Void) {
let usersURL = URL(string: Constants.url)
guard let url = usersURL else {
completion(.failure(.invalidURL))
return
}
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
if let _ = error {
completion(.failure(.unableToComplete))
}
guard let response = response as? HTTPURLResponse, response.statusCode == 200 else {
completion(.failure(.invalidResponse))
return
}
guard let data = data else {
completion(.failure(.invalidData))
return
}
do {
let users = try JSONDecoder().decode([User].self, from: data)
completion(.success(users))
} catch {
completion(.failure(.invalidData))
}
}
task.resume()
}
//MARK: 1. example -> with completion handlers
private var users = [User]()
private func getUsersFirstExample() {
NetworkManager.shared.fetchUsersFirstExample { [weak self] result in
guard let weakself = self else { return }
switch result {
case .success(let users):
DispatchQueue.main.async {
weakself.users = users
weakself.tableView.reloadData()
}
case .failure(let error):
print(error)
}
}
}
//MARK: fetch users with async/await using Result type
func fetchUsersSecondExample() async -> Result<[User], NetworkingError> {
let usersURL = URL(string: Constants.url)
guard let url = usersURL else {
return .failure(.invalidURL)
}
do {
let (data, _) = try await URLSession.shared.data(from: url)
let users = try JSONDecoder().decode([User].self, from: data)
return .success(users)
}
catch {
return .failure(.invalidData)
}
}
//MARK: 2. example -> async/await with Result type
private func getUsersSecondExample() {
async {
let result = await NetworkManager.shared.fetchUsersSecondExample()
switch result {
case .success(let users):
DispatchQueue.main.async {
self.users = users
self.tableView.reloadData()
}
case .failure(let error):
print(error)
}
}
}
//MARK: fetch users with async/await third example, without Result type
func fetchUsersThirdExample() async throws -> [User]{
let usersURL = URL(string: Constants.url)
guard let url = usersURL else { return [] }
let (data, _) = try await URLSession.shared.data(from: url)
let users = try JSONDecoder().decode([User].self, from: data)
return users
}
override func viewDidLoad() {
super.viewDidLoad()
configureTableView()
async {
let users = await getUsersThirdExample()
guard let users = users else { return }
self.users = users
self.tableView.reloadData()
}
}
//MARK: 3. example -> async/await without Result type
private func getUsersThirdExample() async -> [User]? {
do {
let result = try await NetworkManager.shared.fetchUsersThirdExample()
return result
} catch {
// handle errors
}
return nil
}