일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- network
- SwiftUI
- dart
- uikit
- singleton
- Adapter
- weatherkit
- designpattern
- WiFi
- WWDC24
- flutter
- tuist
- OpenAI
- dartz
- EventLoop
- SampleApp
- Architecture
- philipshue
- iot
- concurrency
- 문법
- Xcode
- GIT
- LifeCycle
- AppleDeveloper
- factory
- state
- builder
- swift
- isolate
Archives
- Today
- Total
Jaebi의 Binary는 호남선
Combine & Async/Await 알아보기 본문
목차
비동기 프로그래밍 처리
- Completion Handlers
- 가장 기본적인 비동기 처리 방식
- 작업 완료하면 호출되는 클로저를 통해 결과를 전달
- 장점: 기존 콜백 방식으로 Swift 초기 버전부터 사용 가능
- 단점: Reference counting을 신경 써줘야함 (weak self), 컴플리션 호출 누락 가능, 콜백 지옥 및 가독성 저하
func fetchData(completion: @escaping (Result<Data, Error>) -> Void) {
// 비동기 작업 수행
DispatchQueue.global().async {
// 작업 완료 후, 결과를 completion으로 전달
if let data = ... { // 데이터 가져오기 성공
completion(.success(data))
} else {
completion(.failure(someError))
}
}
}
fetchData { result in
switch result {
case .success(let data):
print("Data fetched: \(data)")
case .failure(let error):
print("Failed to fetch data: \(error)")
}
}
- Combine
- 반응형 프로그래밍 프레임워크, 비동기 데이터 흐름을 처리
- 장점: 순정 라이브러리, 선언적인 방식으로 데이터 흐름 관리
- 단점: 개념과 사용법이 다소 복잡함
import Combine
class DataFetcher {
var cancellables = Set<AnyCancellable>()
func fetchData() -> AnyPublisher<Data, Error> {
let url = URL(string: "https://api.example.com/data")!
return URLSession.shared.dataTaskPublisher(for: url)
.map(\.data)
.mapError { $0 as Error }
.eraseToAnyPublisher()
}
func processFetchedData() {
fetchData()
.sink(receiveCompletion: { completion in
switch completion {
case .finished:
break
case .failure(let error):
print("Failed to fetch data: \(error)")
}
}, receiveValue: { data in
print("Data fetched: \(data)")
})
.store(in: &cancellables)
}
}
- Async/Await
- Swift 5.5부터 도입, 비동기 코드를 더 직관적으로 작성
- 장점: 가독성이 매우 좋음, 네이티브임
- 단점: Swift 5.5 부터 가능, 내부 동작 과정에서 추가적인 메모리 사용 필요, 여러개 비동기 작업을 동시에 실행하는 것은 다소 까다로움
func fetchData() async throws -> Data {
// 비동기 데이터 가져오기
let url = URL(string: "https://example.com")!
let (data, _) = try await URLSession.shared.data(from: url)
return data
}
Task {
do {
let data = try await fetchData()
print("Data fetched: \(data)")
} catch {
print("Failed to fetch data: \(error)")
}
}
어떤 상황에 무엇을 사용?
- Combine
- 데이터 스트림의 처리와 변환, 복잡한 비동기 작업 흐름
- Async/Await
- 단순한 비동기 작업 및 읽기 쉬운 코드 작성용
- 결론
- Network Layer에서는 async/await을 사용, ViewModel과 UI간의 binding은 combine으로?
- MVVM이 아닌 MVI (TCA)일때는 다르게 가야할지 고려
- Network Layer에서는 async/await을 사용, ViewModel과 UI간의 binding은 combine으로?
'Swift' 카테고리의 다른 글
UIKit - View (0) | 2024.08.06 |
---|---|
Swift 개발시 유용한 링크 (0) | 2024.08.05 |
UIKit - 기본 (0) | 2024.08.05 |
SwiftUI - .onAppear() vs .task() (1) | 2024.07.23 |
SwiftUI - ViewModifier (1) | 2024.07.23 |