Jaebi의 Binary는 호남선

Combine & Async/Await 알아보기 본문

Swift

Combine & Async/Await 알아보기

jaebijae 2024. 8. 19. 03:11

목차

    비동기 프로그래밍 처리

    • 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)일때는 다르게 가야할지 고려

     

    '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