일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- wwdc23
- async
- Custom URL Scheme
- ios
- The Composable Architecture
- combine
- Universal Link
- App Thinning
- Dynamic Dispatch
- @NameSpace
- ScrollViewReader
- architecture
- ScrollViewProxy
- Concurrency Programming
- fileprivate
- @ObservedObject
- SwiftData
- AnyCancellable
- Combine vs Async/Await
- SFSafariView
- SwiftUI
- Static Dispatch
- swift
- async/await
- MVVM
- await
- @StateObject
- @main
- 이것이나의다정입니다
- matchedGeometryEffect
- Today
- Total
홍로그
Combine vs Async/Await 본문
Combine과 Async/Await 비교~
Swift는 현대적인 비동기 프로그래밍을 위한 여러 가지 기술을 제공한다. Swift의 Combine 프레임워크와 Swift 5.5에서 도입된 Async/Await 패턴은 개발자들이 비동기 작업을 처리하고 조합하는 데 사용됩니다.
Combine 소개
Combine은 Swift에서 비동기 및 이벤트 기반 프로그래밍을 위한 프레임워크다. Combine은 Publisher-Subscriber 패턴을 기반으로 하며, 데이터의 흐름을 선언적으로 처리할 수 있도록 한다. Combine은 주로 데이터 스트림의 변환, 조합 및 필터링과 같은 작업에 사용된다.
Combine은 비동기 작업과 이벤트 처리를 쉽게 조합할 수 있는 많은 연산자를 제공한다. 이를 통해 다양한 데이터 처리 및 비동기 작업 흐름을 간결하게 표현할 수 있다. Combine의 핵심 개념은 Publisher와 Subscriber다. Publisher는 데이터나 이벤트를 생성하고 Subscriber는 이러한 데이터나 이벤트를 처리하는 역할을 한다. 다음은 Combine을 사용한 예시 코드다.
import Combine
func fetchUser() -> AnyPublisher<User, Error> {
// User 데이터를 비동기적으로 가져오는 Publisher 생성
// ...
}
func fetchPosts(userId: String) -> AnyPublisher<[Post], Error> {
// 해당 사용자의 포스트들을 비동기적으로 가져오는 Publisher 생성
// ...
}
func fetchComments(postIds: [String]) -> AnyPublisher<[Comment], Error> {
// 포스트들에 대한 댓글들을 비동기적으로 가져오는 Publisher 생성
// ...
}
func fetchUserData() -> AnyPublisher<UserData, Error> {
return fetchUser()
.flatMap { user in
fetchPosts(userId: user.id)
.map { posts in
(user, posts)
}
}
.flatMap { user, posts in
fetchComments(postIds: posts.map { $0.id })
.map { comments in
UserData(user: user, posts: posts, comments: comments)
}
}
.eraseToAnyPublisher()
}
fetchUserData()
.sink { completion in
// 완료 처리 로직 작성
} receiveValue: { userData in
// userData를 처리하는 로직 작성
}
Async/Await 소개
Async/Await은 Swift 5.5부터 도입된 기능으로, 비동기 코드를 동기적인 구문으로 작성할 수 있게 해 준다. Async/Await은 비동기 작업을 쉽게 표현하고 제어하기 위해 사용된다. 코드를 선언적이고 읽기 쉽게 작성할 수 있어 개발자의 생산성을 높여준다.
Async/Await은 비동기 작업을 호출하는 함수 앞에 async 키워드를 붙이고, 해당 작업을 기다리는 부분에 await 키워드를 사용한다. 이를 통해 비동기 코드를 동기적인 구문과 유사하게 작성할 수 있으며, 에러 처리도 편리하게 처리할 수 있다. 다음은 Async/Await을 사용한 예시 코드다.
func fetchUser() async throws -> User {
// User 데이터를 비동기적으로 가져오는 함수
// ...
}
func fetchPosts(userId: String) async throws -> [Post] {
// 해당 사용자의 포스트들을 비동기적으로 가져오는 함수
// ...
}
func fetchComments(postIds: [String]) async throws -> [Comment] {
// 포스트들에 대한 댓글들을 비동기적으로 가져오는 함수
// ...
}
func fetchUserData() async throws -> UserData {
let user = try await fetchUser()
let posts = try await fetchPosts(userId: user.id)
let comments = try await fetchComments(postIds: posts.map { $0.id })
return UserData(user: user, posts: posts, comments: comments)
}
do {
let userData = try await fetchUserData()
// userData를 처리하는 로직 작성
} catch {
// 에러 처리 로직 작성
}
Combine vs Async/Await
Combine과 Async/Await은 모두 비동기 프로그래밍을 위한 유용한 도구다. 그러나 어떤 상황에서 어느 것을 선택해야 할까?
- Combine은 주로 데이터 스트림의 처리와 변환에 사용된다. 데이터의 흐름을 표현하고 여러 연산자를 조합해 작업을 수행할 수 있다. Combine은 복잡한 비동기 작업의 흐름을 다루기에 적합하다.
- Async/Await은 비동기 작업을 간결하고 직관적으로 작성할 수 있도록 해준다. 코드를 동기적인 구문과 유사하게 작성할 수 있으며, 에러 처리도 편리하게 처리할 수 있다. Async/Await은 비동기 작업을 단순하고 직관적으로 다루기에 적합하다.
- 따라서, 데이터 스트림의 처리와 복잡한 비동기 작업 흐름을 다루어야 하는 경우 Combine을 사용하는 것이 좋고, 단순한 비동기 작업 처리와 읽기 쉬운 코드 작성을 위해서는 Async/Await을 사용하는 것이 좋습니다.
결론
Swift의 Combine과 Async/Await은 모두 비동기 프로그래밍을 위한 강력한 도구다. Combine은 데이터 스트림의 처리와 변환에 적합하며, Async/Await은 비동기 작업을 간결하고 직관적으로 처리할 수 있도록 도와준다. 개발자는 사용 사례와 요구 사항을 고려하여 적절한 도구를 선택할 수 있어야 한다.
'iOS' 카테고리의 다른 글
SwiftUI @State (0) | 2023.06.01 |
---|---|
MVVM 패턴 (0) | 2023.05.31 |
Swift Async/Await (0) | 2023.05.28 |
Swift Combine (0) | 2023.05.27 |
inout / mutating (2) | 2023.05.26 |