본문 바로가기
앱/iOS(Swift)

[Swift] 클로저 이해하기위해 메모

by 리드맥 2022. 3. 14.

 

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

-> 추가

통신이나 비동기 처리에서 사용하는이유:  비동기적 처리를 하기때문에 함수가 리턴되기전에 서버작업이 완료되었는지 보장이 되지 않기 때문에 시용

탈출 클로저는 특정 함수가 종료될때 특정 행동을 취하기 때문에 탈출 클로저를 사용하는것

댓글