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μ μ¬μ©νμ§ μλλ€λ©΄ ν¨μκ° λ°νλλ©΄μ ν΄λ‘μ κ° λ©λͺ¨λ¦¬μ ν΄μ λμ΄ μ΄νμ νΈμΆλ μ μκ² λλ€.
λ°λΌμ ν΄λ‘μ λ΄μ μ½λλ μ€νλμ§ μκ² λλ€.
μκ°μ΄ μ€λ 걸리λ λ€νΈμν¬ μμ²μ΄ μλ£λκΈ° μ μ ν¨μκ° λ°νλκΈ° λλ¬Έμ ν΄λ‘μ κ° λ©λͺ¨λ¦¬μμ ν΄μ λμ΄ μ΄ν νΈμΆ λμ§ μκΈ° λλ¬Έ.
'π iOS > Network' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
DispatchQueue.global().asyncμ DispatchQueue.main.async (0) | 2024.08.03 |
---|---|
[URLSession] completion(nil) λμ Result νμ μ¬μ©ν΄λ³΄κΈ° (0) | 2024.08.02 |
[λ€νΈμν¬] iOS λ€νΈμνΉ λΌμ΄λΈλ¬λ¦¬: AlamoFire, Moya, RxMoya μ μ§μ ꡬν (0) | 2024.07.30 |
[λ€νΈμν¬] URLSession - .resum()κ³Ό task.resum()μ μ°¨μ΄? (0) | 2024.07.29 |
[ Swift ] λ€νΈμν¬ ν΅μ - URLSession (0) | 2024.07.15 |