Search code examples
swiftxcodeapirx-swiftmoya

how i can use retailId(from flatMapLatest) in another func


ViewModel:

        searchButtonInDidTapSubject.withLatestFrom(retailIdSubject.map { text in return text}).flatMapLatest { [unowned self] retailId in
        return service.searchRetailPayCashBack(retailId: retailId, createdAt: self.createdDates, sig: self.sig).materialize();
        }.subscribe(onNext: { [weak self] event in
            switch (event) {
            case .next(_):
                self?.checkResultSubject.onNext(true)
                break;
            case .error(let error):
                self?.errorSubject.onNext(error as! ErrorResponse);
                break;
            default:
                break;
            }
        }).disposed(by: disposeBag);

// here i need to convert retailId , currentTime and accessToken after that i send request api

 private var sig: String{
get {
    let accessToken = self.keychain.get(Constants.accessToken)
    // ???
    let newAccessToken = String((accessToken?.substring(with: 11..<21))!)
    let retailid = ???
    let newSig = "\(newAccessToken)\(self.createdDates)\(retailid)"
    let md5Base64 = newSig.base64Encoded()
    let md5Data = self.MD5(md5Base64!)
    return String(md5Data!)

}
}

retailId needs to be equal to retailid


Solution

  • Not sure what are you trying to achieve, but it sounds like the sig should be generated each time you tap the button, because the retailId can be different.

    searchButtonInDidTapSubject
        .withLatestFrom(retailIdSubject.map { text in return text })
        .flatMapLatest { [unowned self] retailId in
            return service
                .searchRetailPayCashBack(
                    retailId: retailId,
                    createdAt: self.createdDates,
                    sig: self.sig(withRetailId: retailId, createdDate: self.createdDates)
                )
                .materialize()
        }
        .subscribe(onNext: { [weak self] event in
            switch (event) {
            case .next(_):
                self?.checkResultSubject.onNext(true)
                break;
            case .error(let error):
                self?.errorSubject.onNext(error as! ErrorResponse);
                break;
            default:
                break;
            }
        })
        .disposed(by: disposeBag)
    
    func sig(withRetailId retailId: String, createdDate: String) -> String {
        let accessToken = self.keychain.get(Constants.accessToken)
        // ???
        let newAccessToken = String((accessToken?.substring(with: 11..<21))!)
        let newSig = "\(newAccessToken)\(createdDate)\(retailId)"
        let md5Base64 = newSig.base64Encoded()
        let md5Data = self.MD5(md5Base64!)
        return String(md5Data!)
    }