본문 바로가기

UIKIT/비동기

🤔 Combine에서 Future를 사용하는 이유

https://explorer89.tistory.com/361

 

🤔 Future란? (Combine의 비동기 처리)

https://developer.apple.com/documentation/combine/future Future | Apple Developer DocumentationA publisher that eventually produces a single value and then finishes or fails.developer.apple.com 🚀 Future란? (초보자를 위한 쉬운 설명)Future는

explorer89.tistory.com

 

🤔 Combine에서 Future를 쓰는 의미?

Combine은 비동기 이벤트 스트림을 처리하는 프레임워크
그런데 Combine의 기본 Publisher들은 여러 개의 이벤트를 방출할 수 있는 구조
하지만, 일부 작업은 오직 한 번만 값이 필요

 

예제:

  • 네트워크 요청 후 결과 한 번만 반환
  • Firebase 로그인 (성공 or 실패)
  • 파일 다운로드 후 완료되면 한 번만 알림

이런 경우, Future를 사용하면 적절한 해결책이 됨! 🌟

 

📌 Future가 있을 때 & 없을 때 차이

Future를 사용하면

  • 한 번만 값을 방출한 후 자동으로 종료
  • 네트워크 요청, 인증, 데이터 로드 같은 작업을 깔끔하게 처리

Future 없이 Combine만 사용하면?

  • 일반적인 Publisher(예: PassthroughSubject, Just)를 사용
  • 필요 이상으로 불필요한 값이 여러 번 방출될 가능성이 있음
  • Just는 즉시 값을 방출하지만, Future는 비동기적으로 값을 전달 가능

 

📌 Future가 없을 때 예제 (PassthroughSubject 사용)

Future 없이 Combine을 사용하려면 PassthroughSubject를 직접 만들어서 사용

import Combine

let subject = PassthroughSubject<Int, Never>()

func fetchNumber() {
    DispatchQueue.global().asyncAfter(deadline: .now() + 2) {
        let number = Int.random(in: 1...10)
        subject.send(number)
        subject.send(completion: .finished)  // 종료
    }
}

fetchNumber()

let cancellable = subject.sink { completion in
    print("✅ 완료: \(completion)")
} receiveValue: { value in
    print("🎲 랜덤 숫자: \(value)")
}

 

✅ 작동은 하지만, 불필요한 코드가 많고 직접 종료를 관리해야 함.

 

📌 Future가 있을 때 예제

import Combine

func fetchNumber() -> Future<Int, Never> {
    return Future { promise in
        DispatchQueue.global().asyncAfter(deadline: .now() + 2) {
            let number = Int.random(in: 1...10)
            promise(.success(number))
        }
    }
}

let cancellable = fetchNumber()
    .sink { value in
        print("🎲 랜덤 숫자: \(value)")
    }

 

✅ 자동으로 종료되므로 completion을 신경 쓸 필요가 없음!

 

 

📌 결론: Future는 특정 상황에서 더 유용!

  Future 사용 Future 없이 Combine만 사용
✅ 비동기 작업 네트워크 요청, 인증, 데이터 로드 네트워크 요청 시 직접 Publisher 관리 필요
✅ 이벤트 개수 오직 1회 여러 번 방출될 가능성 있음
✅ 관리 필요함 자동으로 한 번만 값 방출 후 종료 PassthroughSubject 는 직접 종료 관리 필요

 

 

💡 즉, "한 번만 값을 받을 비동기 작업"에는 Future가 훨씬 편리하고 깔끔! 🚀