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>은 구독을 관리하고 해제하는 데 필요합니다.
'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 |