swiftrx-swiftrx-cocoa

"withLatestFrom" won't accept BehaviorRelay


I've got this simple view model to check a phone number's status before registering a user. But I've got this error:

Instance method 'withLatestFrom' requires that 'BehaviorRelay' conform to 'SharedSequenceConvertibleType'

Here's the code:

import Foundation
import RxSwift
import RxCocoa

protocol RegisterViewModelling {
    var openRegistrationData: Signal<String> { get }
    var showErrorMessage: Signal<String> { get }
    var sendButtonActive: Driver<Bool> { get }
    
    var phoneNumberText: BehaviorRelay<String> { get }
    var tapSendButton: PublishRelay<Void> { get }
}

final class RegisterViewModel: RegisterViewModelling {
    var openRegistrationData: Signal<String>
    let showErrorMessage: Signal<String>
    let sendButtonActive: Driver<Bool>
    let phoneNumberText: BehaviorRelay<String> = BehaviorRelay<String>(value: "")
    let tapSendButton: PublishRelay<Void> = PublishRelay<Void>()
        
    init(getPhoneNumberStatus: GetPhoneNumberStatusUseCase) {
        sendButtonActive = phoneNumberText
            .asDriver(onErrorDriveWith: .empty())
            .map(shouldButtonActive(number:))
        
        let isRegistered = tapSendButton
            .withLatestFrom(phoneNumberText)
            .flatMap(getPhoneNumberStatus.get(number:))
            .share()
        
        showErrorMessage = isRegistered
            .asSignal(onErrorSignalWith: .just(true))
            .filter { $0 == true }
            .map { _ in () }
            .map(getErrorMessage)
        
        openRegistrationData = isRegistered
            .asSignal(onErrorSignalWith: .just(true))
            .filter { $0 == false }
            .withLatestFrom(phoneNumberText) // ERROR: Instance method 'withLatestFrom' requires that 'BehaviorRelay<String>' conform to 'SharedSequenceConvertibleType'
        
    }
}

private func shouldButtonActive(number: String) -> Bool {
    return !number.isEmpty && number.count <= 15
}

private func getErrorMessage() -> String {
    return "Phone number has been registered."
}

protocol GetPhoneNumberStatusUseCase {
    func get(number: String) -> Observable<Bool>
}

What went wrong here? Why won't withLatestFrom work at that line but it worked fine on the others? Thanks.


Solution

  • I think it because you have convert isRegistered to Signal before use withLatestFrom. You can try to move asSignal() to below withLatestFrom