본문 바로가기

UIKIT

CreateUser 함수?

https://explorer89.tistory.com/300

 

AnyPublisher?

https://explorer89.tistory.com/299 Combine, FirebaseStore 데이터 저장https://explorer89.tistory.com/298" data-og-description="https://explorer89.tistory.com/297 Combine을 활용한 함수https://explorer89.tistory.com/296 viewModel.$user에서 use

explorer89.tistory.com

 

func createUser() {
    guard let email = email,
          let password = password else { return }
    
    AuthManager.shared.registerUser(with: email, password: password)
        .handleEvents(receiveOutput: { [weak self] user in
            self?.user = user
        })
    
        .sink { [weak self] completion in
            switch completion {
            case .failure(let error):
                self?.error = error.localizedDescription
            case .finished:
                print("성공")
            }
        } receiveValue: { [weak self] user in
            self?.createRecord(for: user)
        }
        .store(in: &subscription)
}

 

 

createUser 함수의 역할:

  • 이 함수는 회원가입을 처리합니다.
  • email과 password를 사용하여 Firebase Auth에서 제공하는 registerUser 메서드를 호출합니다. 이 메서드는 비동기적으로 작업을 처리하며, 그 결과로 User 객체를 반환합니다.

handleEvents 설명:

  • handleEvents는 Publisher에서 값을 방출하거나 작업이 완료되었을 때 특정 작업을 할 수 있게 해주는 메서드입니다. 이 메서드는 Publisher에서 side effect를 처리하는 데 사용됩니다.
  • handleEvents원본 Publisher의 데이터 흐름을 변형하지 않고, 외부에서 추가적인 작업을 할 수 있게 해줍니다.
  • 예를 들어, receiveOutput데이터를 방출할 때 이를 받아서 추가 작업을 할 수 있게 합니다. 위 코드에서는 user를 받아서 self?.user = user로 user 프로퍼티에 할당하고 있습니다. 하지만 이 작업이 데이터의 흐름에 영향을 미치지 않고, 단지 데이터를 받고 처리하는 역할만 합니다.

sink 설명:

  • sink는 Publisher에서 방출되는 데이터를 실제로 처리할 때 사용합니다. sink는 두 가지 클로저를 사용합니다:
    • completion: Publisher의 작업이 완료될 때 호출됩니다. completion은 failure 또는 finished 상태를 구분할 수 있습니다.
      • failure: 오류가 발생했을 때 처리합니다.
      • finished: 모든 작업이 정상적으로 완료되었을 때 처리합니다.
    • receiveValue: Publisher가 데이터를 방출할 때마다 호출됩니다. 이 값은 User 객체입니다. 이곳에서 self?.createRecord(for: user)로 해당 User 정보를 이용해 다른 작업을 처리합니다.

store(in:):

  • store(in:)는 Cancellable 객체를 구독 취소할 수 있도록 관리하는 역할을 합니다. 여기서는 subscription에 구독을 저장하여 나중에 구독을 취소하거나 관리를 할 수 있게 합니다

 

func createRecord(for user: User) {
    DatabaseManager.shared.collectionUsers(add: user)
        .sink { [weak self] completion in
            if case .failure(let error) = completion {
                self?.error = error.localizedDescription
            }
        } receiveValue: { state in
            print("Adding user record to database: \(state)")
        }
        .store(in: &subscription)
}

 

createRecord 함수의 역할:

  • 이 함수는 회원가입이 완료된 후 User 객체를 받아서 해당 사용자의 정보를 Firebase Firestore에 저장하는 역할을 합니다.
  • DatabaseManager.shared.collectionUsers(add: user) 메서드를 호출하여 Firestore에 사용자의 데이터를 추가합니다.

sink 설명:

  • sink는 Publisher에서 방출된 값을 처리하는데 사용됩니다.
    • completion: 데이터 전송이 끝났을 때 호출됩니다. failure일 경우에는 오류를 처리하고, receiveValue에서 성공적인 결과를 처리합니다.
    • receiveValue: DatabaseManager.shared.collectionUsers(add:)에서 반환한 결과를 받습니다. 여기서는 state가 true로 반환되면 "Adding user record to database: true"를 출력합니다.

store(in:):

  • store(in:)는 이 구독을 subscription에 저장하여 구독이 활성화된 상태를 유지하고, 필요 시 구독을 취소할 수 있도록 합니다.

핵심 개념들 정리:

  1. handleEvents:
    • Publisher에서 발생하는 여러 이벤트에 대해 부수적인 작업을 할 수 있도록 도와주는 메서드입니다. 데이터 흐름을 변경하지 않으면서 부가적인 동작을 수행합니다.
  2. sink:
    • Publisher에서 방출되는 데이터를 받아서 처리하는 메서드입니다. 두 개의 클로저로, completion(작업 완료 상태)과 receiveValue(실제 데이터)를 처리합니다.
  3. store(in:):
    • 구독 관리를 위한 메서드입니다. Cancellable 객체를 저장하여 구독을 계속 유지하거나, 나중에 취소할 수 있도록 합니다.

두 함수의 관계:

  • createUser()에서 회원가입을 하고, 그 결과로 User 객체를 받은 뒤, 이를 createRecord()에서 Firestore에 저장하는 구조입니다.
  • createUser()에서 회원가입이 완료된 후, 해당 User를 createRecord()에서 처리하여, Firestore에 데이터를 저장합니다.
  • handleEvents는 비즈니스 로직이 완료된 후에 User 객체를 user 프로퍼티에 할당하는 데 사용됩니다.
  • sink는 비동기 작업의 성공/실패 상태와 값을 받아서 그에 맞는 후속 작업을 처리하는 데 사용됩니다.