self.loadImage2(urlString: hasURL) { image in
cell.movieimageView.image = image
}
func loadImage2(urlString: String, completion: @escaping (UIImage?) -> Void){
networkLayer.request(type: .justURL(urlString: urlString)) { data, response, error in
if let hasData = data {
DispatchQueue.main.async {
//async로 클로저가 나가기 때문에 이스케이프를 사용하는건가?
completion(UIImage(data: hasData))
}
return
}
//살패 했을때도 메모리를 계속 가지고 있기 때문에 실패했을때 nil을 넣어줘서 메모리를 해제 해줘야한다
completion(nil)
}
}
typealias NetworkCompletion = (_ data:Data?, _ response:URLResponse?, _ error:Error?) -> Void
func request(type: MovieAPIType, completion: @escaping NetworkCompletion) {
let sessionConfig = URLSessionConfiguration.default
let session = URLSession(configuration: sessionConfig)
do{
let request = try buildRequest(type: type)
//데이터 get 요청 해서 response로 받아온다 session을 통해서 클로저가 밖으로 나가서 이스케이프를 쓰는건가
session.dataTask(with: request) { data, response, error in
//상태코드 ex: 200, 404 *****
print((response as! HTTPURLResponse).statusCode)
completion(data, response, error)
}.resume()
session.finishTasksAndInvalidate()
}
catch{
//try에서 실패하면 catch문으로 들어감
//에러에 MovieAPIError throw가 들어감
print(error)
}
}
-> 추가
통신이나 비동기 처리에서 사용하는이유: 비동기적 처리를 하기때문에 함수가 리턴되기전에 서버작업이 완료되었는지 보장이 되지 않기 때문에 시용
탈출 클로저는 특정 함수가 종료될때 특정 행동을 취하기 때문에 탈출 클로저를 사용하는것
'앱 > iOS(Swift)' 카테고리의 다른 글
| [Swift] 코드로 뷰추가해보기( autolayout ) (0) | 2022.03.27 |
|---|---|
| [Swift] 오토레이아웃 오토리사이징 (0) | 2022.03.27 |
| [CS] 동기 비동기, 직렬 동시 (0) | 2022.03.14 |
| [Swift] 일급객체 (0) | 2022.03.06 |
| [Swift] 테이블뷰 cell attributedText 사용시 다음 cell까지 코드가 적용되는 문제해결 (0) | 2022.02.22 |
댓글