상세 컨텐츠

λ³Έλ¬Έ 제λͺ©

[URLSession] 비동기 μž‘μ—…, ν΄λ‘œμ €, 콜백 ν•¨μˆ˜, Completion Handler, 그리고 @escaping의 κ°œλ…κ³Ό μ—­ν• 

🍎 iOS/Network

by AHN.Jihyeon 2024. 8. 1. 17:27

λ³Έλ¬Έ

1. 비동기 μž‘μ—… (Asynchronous Operation)

: 비동기 μž‘μ—…μ€ 호좜된 ν•¨μˆ˜κ°€ λ°˜ν™˜λœ 후에도 λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μž‘μ—…μ΄ 계속 μ§„ν–‰λ˜λŠ” 방식이닀닀.

μ£Ό μŠ€λ ˆλ“œλŠ” λ©ˆμΆ”μ§€ μ•Šκ³  λ‹€λ₯Έ μž‘μ—…μ„ 계속할 수 μžˆλ‹€.

 

ν•¨μˆ˜κ°€ λ°˜ν™˜λœ 후에도 μž‘μ—…μ΄ 계속 μ§„ν–‰λœλ‹€.

μž‘μ—… μ™„λ£Œ ν›„ κ²°κ³Όλ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ 콜백 ν΄λ‘œμ € λ˜λŠ” Completion Handlerλ₯Ό μ‚¬μš©ν•œλ‹€.

 

2. ν΄λ‘œμ € (Closure)

: ν΄λ‘œμ €λŠ” ν•¨μˆ˜, μ½”λ“œ 블둝을 λ³€μˆ˜λ‚˜ μƒμˆ˜λ‘œ μ €μž₯ν•˜κ±°λ‚˜ λ‹€λ₯Έ ν•¨μˆ˜μ— 전달할 수 μžˆλŠ” Swift의 ꡬ쑰체이닀.

ν΄λ‘œμ €λŠ” μ½”λ“œ 블둝을 μΊ‘μ²˜ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆλ‹€.

 

ν΄λ‘œμ €λŠ” 비동기 μž‘μ—…, 이벀트 핸듀링, ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° 등에 ν™œμš©λœλ‹€.

μž‘μ—…μ΄ λλ‚œ ν›„ μ‹€ν–‰ν•  μ½”λ“œλ₯Ό μ •μ˜ν•  λ•Œ ν΄λ‘œμ €λ₯Ό μ‚¬μš©ν•œλ‹€. 

 

3. 콜백 ν•¨μˆ˜ (Callback Function)

: 콜백 ν•¨μˆ˜λŠ” λ‹€λ₯Έ ν•¨μˆ˜μ— 인수둜 μ „λ‹¬λ˜λ©°, νŠΉμ • μ‹œμ μ—μ„œ ν˜ΈμΆœλ˜μ–΄ μ‹€ν–‰λ˜λŠ” ν•¨μˆ˜μ΄λ‹€.

콜백 ν•¨μˆ˜λŠ” νŠΉμ • μž‘μ—…μ΄ μ™„λ£Œλœ ν›„ ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜μ΄λ‹€. 일반적으둜 비동기 μž‘μ—…μ˜ κ²°κ³Όλ₯Ό μ²˜λ¦¬ν•˜λŠ” 데 μ‚¬μš©ν•œλ‹€.

 

비동기 μž‘μ—…μ΄ μ™„λ£Œλœ ν›„, κ²°κ³Όλ₯Ό μ²˜λ¦¬ν•˜κ±°λ‚˜ μƒνƒœλ₯Ό μ—…λ°μ΄νŠΈν•˜λŠ” 데 μ‚¬μš©λœλ‹€. 콜백 ν•¨μˆ˜λŠ” μž‘μ—… μ™„λ£Œλ  λ•Œ μžλ™μœΌλ‘œ 호좜됨.

 

4. Completion Handler

비동기 μž‘μ—…μ΄ μ™„λ£Œλ˜μ—ˆμ„ λ•Œ ν˜ΈμΆœλ˜λŠ” ν΄λ‘œμ €(Closure/μ½œλ°±ν•¨μˆ˜)이닀.

이 ν΄λ‘œμ €λŠ” 비동기 μž‘μ—…μ˜ κ²°κ³Όλ₯Ό μ²˜λ¦¬ν•˜κ±°λ‚˜, μž‘μ—…μ΄ μ™„λ£Œλ˜μ—ˆμŒμ„ ν˜ΈμΆœν•œ 곳에 μ•Œλ¦¬κΈ° μœ„ν•΄ μ‚¬μš©λœλ‹€.

 

κ²°κ³Ό 전달: λ„€νŠΈμ›Œν¬ μš”μ²­μ΄ μ„±κ³΅ν–ˆμ„ λ•Œ 데이터λ₯Ό μ „λ‹¬ν•˜κ±°λ‚˜, μ‹€νŒ¨ν–ˆμ„ λ•Œ 였λ₯˜λ₯Ό completion handlerλ₯Ό 톡해 ν˜ΈμΆœν•œ 곳으둜 μ „λ‹¬ν•œλ‹€.

비동기 μž‘μ—… μ™„λ£Œ μ•Œλ¦Ό: 비동기 μž‘μ—…μ΄ 끝났을 λ•Œ 이λ₯Ό μ•Œλ¦¬κΈ° μœ„ν•΄ μ‚¬μš©λœλ‹€. 

 

주둜 λ„€νŠΈμ›Œν¬ μš”μ²­, 파일 읽기/μ“°κΈ°, 타이머, μ• λ‹ˆλ©”μ΄μ…˜ λ“±μ˜ 비동기 μž‘μ—…μ— μ‚¬μš©λœλ‹€.

//[ Completion Handler의 μ •μ˜ ]

//completion은 [Movie]? νƒ€μž…μ˜ 값을 λ°›μ•„μ„œ λ°˜ν™˜ν•˜μ§€ μ•ŠλŠ” ν΄λ‘œμ €(콜백 ν•¨μˆ˜). 
//@escaping ν‚€μ›Œλ“œλŠ” 이 ν΄λ‘œμ €κ°€ 비동기 μž‘μ—… 후에 호좜될 수 μžˆμŒμ„ 보μž₯.
func fetchMovies(completion: @escaping ([Movie]?) -> Void) { //Completion Handler μ •μ˜

    let url = URL(string: "https://api.example.com/movies")! 
    
    let task = URLSession.shared.dataTask(with: url) { data, response, error in //비동기 λ„€νŠΈμ›Œν¬ μš”μ²­ 생성
        if let error = error { 
            print("Error fetching movies: \(error)")
            completion(nil) // 비동기 μž‘μ—…(μš”μ²­) μ™„λ£Œ ν›„ 콜백 호좜 - 였λ₯˜κ°€ λ°œμƒν–ˆμ„ λ•Œ completion handler 호좜  
            return
        }
        
        guard let data = data else {
            completion(nil) //비동기 μž‘μ—… μ™„λ£Œ ν›„ 콜백 호좜 - 데이터가 μ—†λŠ” 경우 completion handler 호좜
            return
        }
        
        // JSON 데이터λ₯Ό νŒŒμ‹±
        let decoder = JSONDecoder()
        if let movies = try? decoder.decode([Movie].self, from: data) {
            completion(movies) //비동기 μž‘μ—… μ™„λ£Œ ν›„ 콜백 호좜 - μ„±κ³΅μ μœΌλ‘œ 데이터λ₯Ό νŒŒμ‹±ν•œ 경우 completion handler 호좜
        } else {
            completion(nil) //비동기 μž‘μ—… μ™„λ£Œ ν›„ 콜백 호좜 - νŒŒμ‹±μ— μ‹€νŒ¨ν•œ 경우 completion handler 호좜
        }
    }
    
    task.resume() // λ„€νŠΈμ›Œν¬ μš”μ²­μ„ μ‹œμž‘
}




=============================================
//[ Completion Handler μ‚¬μš©ν•  λ•Œ ]


// Movie λͺ¨λΈ μ •μ˜ (μ˜ˆμ‹œ)
struct Movie: Decodable {
    let title: String
    let releaseDate: String
}

// fetchMovies ν•¨μˆ˜ μ‚¬μš© μ˜ˆμ‹œ
func exampleUsage() {
    // fetchMovies ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜κ³  completion handlerλ₯Ό 톡해 κ²°κ³Όλ₯Ό 처리
    fetchMovies { movies in
        if let movies = movies {
            // 데이터λ₯Ό μ„±κ³΅μ μœΌλ‘œ λ°›μ•„μ˜¨ 경우
            print("Fetched movies:")
            for movie in movies {
                print("Title: \(movie.title), Release Date: \(movie.releaseDate)")
            }
        } else {
            // 였λ₯˜κ°€ λ°œμƒν•˜κ±°λ‚˜ 데이터가 μ—†λŠ” 경우
            print("Failed to fetch movies or no movies found.")
        }
    }
}

// μ‹€μ œ μ‚¬μš© μ˜ˆμ‹œ 호좜
exampleUsage()

 

5. @escaping

: @escaping ν‚€μ›Œλ“œλŠ” ν΄λ‘œμ €κ°€ ν•¨μˆ˜μ˜ λ°˜ν™˜ μ‹œμ  이후에도 호좜될 수 μžˆλ„λ‘ 보μž₯ν•˜λŠ” ν‚€μ›Œλ“œ 

비동기 μž‘μ—…μ—μ„œ ν΄λ‘œμ €κ°€ ν•¨μˆ˜κ°€ λ°˜ν™˜λœ 후에도 μ‹€ν–‰λ˜λ„λ‘ ν•œλ‹€.

 

@escaping을 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ ν•¨μˆ˜κ°€ λ°˜ν™˜λ˜λ©΄μ„œ ν΄λ‘œμ €κ°€ λ©”λͺ¨λ¦¬μ— ν•΄μ œλ˜μ–΄ 이후에 호좜될 수 μ—†κ²Œ λœλ‹€. 

λ”°λΌμ„œ ν΄λ‘œμ € λ‚΄μ˜ μ½”λ“œλŠ” μ‹€ν–‰λ˜μ§€ μ•Šκ²Œ λœλ‹€. 

μ‹œκ°„μ΄ 였래 κ±Έλ¦¬λŠ” λ„€νŠΈμ›Œν¬ μš”μ²­μ΄ μ™„λ£Œλ˜κΈ° 전에 ν•¨μˆ˜κ°€ λ°˜ν™˜λ˜κΈ° λ•Œλ¬Έμ— ν΄λ‘œμ €κ°€ λ©”λͺ¨λ¦¬μ—μ„œ ν•΄μ œλ˜μ–΄ 이후 호좜 λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έ.  

κ΄€λ ¨κΈ€ 더보기