본문 바로가기
UIKIT

eraseToAnyPublisher(), Set<AnyCancellable>

by 밤새는 탐험가89 2025. 1. 8.
728x90
SMALL

https://explorer89.tistory.com/297

 

Combine을 활용한 함수

https://explorer89.tistory.com/296 viewModel.$user에서 user 앞에 $를 붙이는 이유https://explorer89.tistory.com/295 ViewModel을 사용하는 목적https://explorer89.tistory.com/294 ViewModelhttps://explorer89.tistory.com/82 ObservableObject

explorer89.tistory.com

 

eraseToAnyPublisher()의 역할

eraseToAnyPublisher()는 연산자의 타입을 숨기기 위한 메서드입니다. 이를 사용하면 반환되는 Publisher의 타입을 구체적으로 지정하지 않고, AnyPublisher 타입으로 반환할 수 있습니다. 예를 들어, 메서드에서 복잡한 Publisher 체인을 다룰 때 eraseToAnyPublisher()를 사용하여, 외부에서는 AnyPublisher 타입만 알면 되도록 하여 코드의 추상화와 일관성을 제공합니다.

 

func collectionUsers(add user: User) -> AnyPublisher<Bool, Error> {
    let twitterUser = TwitterUser(from: user)
    return db.collection(userPath).document(twitterUser.id).setData(from: twitterUser)
        .map { _ in
            return true
        }
        .eraseToAnyPublisher()  // 반환 타입을 AnyPublisher로 숨깁니다.
}

 

위 코드에서 eraseToAnyPublisher()는 setData의 반환 타입을 AnyPublisher<Bool, Error>로 변환하여 반환하는 역할을 합니다

 

private var subscription: Set<AnyCancellable> = []의 역할

Set<AnyCancellable>은 Publisher에 구독(subscribe)하여 구독을 취소할 수 있는 기능을 제공합니다. AnyCancellable 객체는 Combine의 구독을 관리하고, 구독을 해제하는 데 사용됩니다. 예를 들어, 구독이 끝날 때까지 객체가 메모리에 남아 있어야 하므로, Set<AnyCancellable>을 통해 해당 구독을 관리합니다.

collectionUsers(add: user)
    .sink(receiveCompletion: { completion in
        switch completion {
        case .finished:
            print("Success!")
        case .failure(let error):
            print("Error: \(error)")
        }
    }, receiveValue: { success in
        print("User added: \(success)")
    })
    .store(in: &subscription)  // 구독을 Set에 저장

 

 

eraseToAnyPublisher()와 Set<AnyCancellable>의 관계

  • eraseToAnyPublisher()는 메서드의 반환 타입을 AnyPublisher로 감추는 데 사용됩니다.
  • Set<AnyCancellable>은 구독을 추적하고 관리하기 위해 사용됩니다.

따라서, 두 가지를 함께 사용하는 것은 서로 다른 목적을 가지고 있습니다:

  • eraseToAnyPublisher()는 Publisher의 구체적인 타입을 숨기고, 코드의 일관성을 유지하려는 목적입니다.
  • Set<AnyCancellable>은 구독을 관리하고 해제하는 데 필요합니다.
728x90
LIST

'UIKIT' 카테고리의 다른 글

AnyPublisher?  (0) 2025.01.08
Combine, FirebaseStore 데이터 저장  (0) 2025.01.08
Combine을 활용한 함수  (0) 2025.01.08
viewModel.$user에서 user 앞에 $를 붙이는 이유  (0) 2025.01.08
ViewModel을 사용하는 목적  (0) 2025.01.08