[SwiftUI] Combine - 기본

2023. 9. 16. 23:44·Swift/정리
728x90

Combine을 쓰면 좋은 이유

  • 아래 코드 예시는 로그인을 할때 userId와 userName을 가져올때 사용할 수 있는 코드이다.
  • switch case를 사용하며 값이 두개 밖에 처리 할 것이 없을때는 사용 가능하겠지만 값이 점점 많아지고 복잡해지면 switch case를 이용해서 하기 어려워질 것이다.
func fetchUserId(_ completionHandler: @escaping (Result<Int, Error> ) -> Void){
    DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
        let result = 24
        completionHandler(.success(result))
    }
}

func fetchName(for userId: Int,_ completionHandler: @escaping (Result<String, Error>) -> Void) {
    DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
        let result = "Bulmang"
        completionHandler(.success((result)))
    }
}

func run() {
    fetchUserId { userIdResult in
        switch userIdResult {
        case .success(let userId):
            fetchName(for: userId) { nameResult in
                switch nameResult {
                case .success(let name):
                    print(name)
                case .failure(let failure):
                    // 실패 처리
                    break
                }
            }
        case .failure(let failure):
            // 실패 처리
            break
        }
    }
}

다른 비동기 처리 방식과의 차이점

특징 "async/await" "Combine" RxSwift

비동기 작업 처리 개별 비동기 함수 호출 Publisher-Subscriber 모델 Observable-Observer 모델
에러 처리 일반적인 try-catch 구문 사용 sink 및 Operator에서 에러 처리 onError 이벤트 핸들링
코드 구조 동기적인 코드와 유사함 비동기 스트림 및 데이터 흐름의 조작을 위한 연산자 활용 비동기 스트림 및 연산자 활용
간소화된 코드 작성 간결하고 직관적인 코드 작성 코드는 조금 더 길어질 수 있지만 강력한 연산자 활용 코드는 길어지지만 강력한 연산자 활용
복잡한 비동기 흐름 관리 일반적으로 한 번에 한 비동기 작업 처리 여러 비동기 작업의 조합, 복잡한 데이터 흐름 관리 여러 비동기 작업의 조합, 데이터 흐름 관리
적합한 사용 사례 간단한 비동기 작업 및 단일 비동기 호출 여러 비동기 작업의 관리, 데이터 스트림 처리 여러 비동기 작업의 관리, 데이터 스트림 처리
지원 범위 및 버전 Swift 5.5 이상 iOS 13 이상 iOS 8 이상, macOS 10.10 이상

간단한 비동기 처리를 할때는 **"async/await"**가 좋다

하지만 여러 비동기 작업 관리와 데이터 스트림 처리를 하려면 Combine, RxSwift 이지만 SwiftUI에 더 효율성 있는 프레임워크는 Combine 이다.

Publisher를 이용한 코드 예시

[1, 2, 3, 4, 5]
        .publisher
        .print()
        .filter { $0.isMultiple(of: 2) == false }
        .map { $0 * $0 }
        .sink { value in
            print(value)
        }
        .store(in: &cancel)

설명

  • .print()를 사용하여 Debug를 쉽게 확인할 수 있다.
  • 출력 결과 :
  • receive value: (1) 1 receive value: (2) request max: (1) (synchronous) receive value: (3) 9 receive value: (4) request max: (1) (synchronous) receive value: (5) 25 receive finished
728x90

'Swift > 정리' 카테고리의 다른 글

XCODE IOS 프로파일링 디버깅 하는 방법  (1) 2024.01.07
[SwiftUI] 아키텍처 고민  (0) 2024.01.06
[SwiftUI] Combine  (0) 2023.09.16
[Swift] SwiftLint  (0) 2023.09.04
[SwiftUI] NavigationStack  (0) 2023.09.02
'Swift/정리' 카테고리의 다른 글
  • XCODE IOS 프로파일링 디버깅 하는 방법
  • [SwiftUI] 아키텍처 고민
  • [SwiftUI] Combine
  • [Swift] SwiftLint
bulmang
bulmang
모바일 개발자 도전
  • bulmang
    bulmang
    bulmang
  • 전체
    오늘
    어제
    • 분류 전체보기 (208)
      • 알고리즘 (68)
        • List (3)
        • Two Pointer (6)
        • Binary Search (4)
        • Prefix Sum (3)
        • Sort (4)
        • Brute Force (5)
        • Array (2)
        • String (4)
        • 프로그래머스 (12)
        • 백준 (9)
        • Queue (2)
        • Stack (2)
        • Recursion (12)
      • Computer Science (16)
        • Computer Architecture (6)
        • Operating System (5)
        • Network (2)
        • 기타 (2)
        • System Programming (1)
      • Swift (70)
        • 개발 (24)
        • 정리 (25)
        • 문법 (20)
      • Flutter (24)
      • 기타 (12)
        • 후기 (12)
      • Git (6)
      • Ios 오픈소스 (5)
      • UI 디자인 (5)
      • AppleScript (2)
  • 링크

    • Notion
    • Github
  • 태그

    riverpod
    IOS
    자료구조
    Swift
    문법
    백준
    피플
    til
    협업
    Apple Developer Academy
    SwiftUI
    Xcode
    재귀
    FLUTTER
    코딩테스트
    개발
    컴퓨터구조
    알고리즘
    Java
    today i learned
  • 최근 댓글

  • 최근 글

  • 인기 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.2
bulmang
[SwiftUI] Combine - 기본
상단으로

티스토리툴바