guard let url: URL = URL(string: " ~~ url ~~ ") else { return }
// url에 요청
let session: URLSession = URLSession(configuration: .default)
// session을 만들어줌
// dataTask를 만들어 줌 -> url로 요청함
// 뒤의 클로저는 요청에 대한 서버의 응답이 왔을 때 호출될 클로저
let dataTask: URLSessionDataTask = session.dataTask(with: url) { (data: Data?, response: URLResponse?, error: Error?) in
if let error = error {
print(error.localizedDescription)
return
}
guard let data = data else { return }
// 받아온 데이터를 가지고 JSONDecoder를 사용해서 APIResponse 형식으로 decode
do {
let apiResponse: APIResponse = try JSONDecoder().decode(APIResponse.self, from: data)
self.friends = apiResponse.results
// APIResponse에 결과가 들어왔다면 friends에 저장
// tableView reload는 메인 스레드에서 호출해줘야 됨 !!!!!! (현재 백그라운드)
// closure는 메인 스레드에서 동작하지 않음. 백그라운드에서 동작
// 네트워크를 끝내고 받아온 데이터를 처리
self.tableView.reloadData()
} catch(let arr) {
print(err.localizedDescription)
}
}
dataTask.resume()
// 이를 호출해주면 이 때 dataTask를 실행하고 서버에 요청
tableView.reloadData() 는 메인 스레드에서 호출해줘야 하기 때문에 아직은 잘못된 코드
Closure는 당장 실행할 코드가 아니고 요청에 대한 응답이 왔을 때 실행하는 코드
실질적으로 우리가 실행하는 코드는 session 생성, dataTask 추가, dataTask 실행
'iOS' 카테고리의 다른 글
[iOS] Photos Framework (0) | 2020.06.08 |
---|---|
[iOS] DispatchQueue로 비동기 프로그래밍 (0) | 2020.06.08 |
[iOS] URLSession과 URLSessionDataTask (0) | 2020.06.08 |
[iOS] Grand Central Dispatch (GCD) (0) | 2020.06.08 |
[iOS] OperationQueue로 비동기 프로그래밍 (0) | 2020.06.08 |