switchmap에 해당하는 RxSwift

낮은

RxJS에서는 새로운 Observable에 대해 Observable의 값을 사용할 수 있습니다. 예를 들면 :

this.authService.login(username, password).pipe(
  switchMap((success: boolean) => {
    if(success) {
      return this.contactService.getLoggedInContact()
    } else {
      return of(null)
    }
  })
).subscribe(contact => {
  this.contact = contact
})

하지만 지금은 Swift로 프로젝트를해야하고 같은 일을하고 싶습니다. 두 가지 방법을 사용할 수 있지만 두 번째 Observable에 첫 번째 Observable의 결과를 사용하는 것은 작동하지 않습니다. switchMap파이프 RxSwift에 존재하지 않는 뭔가 내가 동등한를 찾을 수 없습니다.

로그인 기능의 결과를 Observable에 매핑 한 다음 플랫 매핑을 시도했지만 불행히도 작동하지 않았습니다.

구독에서 구독을 사용하지 않고 Swift에서 이것을 수행하는 가장 좋은 방법은 무엇입니까?

편집 나는 평면지도를 시도했다 :

APIService.login(email: "username", password: "password")
  .flatMapLatest { result -> Observable<Contact> in
    if result {
      return APIService.getLoggedInContact()
    } else {
      return .of()
    }
  }.subscribe(onNext: {result in
    print("Logged in contact: \(result)")
  }, onError: {Error in
    print(Error)
  }).disposed(by: disposeBag)

하지만 안타깝게도 작동하지 않았습니다. 오류가 발생했습니다. Thread 1: EXC_BAD_ACCESS (code=1, address=0x13eff328c)

EDIT2 :

이것은 로그인 기능입니다

static func login(email: String, password: String) -> Observable<Bool> {
        return Observable<String>.create { (observer) -> Disposable in
            Alamofire.request(self.APIBASEURL + "/contact/login", method: .post, parameters: [
                "email": email,
                "password": password
            ], encoding: JSONEncoding.default).validate().responseJSON(completionHandler: {response in
                if (response.result.isSuccess) {
                    guard let jsonData = response.data else {

                        return observer.onError(CustomError.api)
                    }
                    let decoder = JSONDecoder()

                    let apiResult = try? decoder.decode(ApiLogin.self, from: jsonData)
                    return observer.onNext(apiResult!.jwt)
                } else {
                    return self.returnError(response: response, observer: observer)
                }
            })

            return Disposables.create()
        }.map{token in
            return KeychainWrapper.standard.set(token, forKey: "authToken")
        }
    }

이것은 getLoggedInContact 함수입니다.

static func getLoggedInContact() -> Observable<Contact> {
        return Observable.create { observer -> Disposable in
            Alamofire.request(self.APIBASEURL + "/contact/me", method: .get, headers: self.getAuthHeader())
              .validate().responseJSON(completionHandler: {response in
                if (response.result.isSuccess) {
                    guard let jsonData = response.data else {

                        return observer.onError(CustomError.api)
                    }

                    let decoder = JSONDecoder()
                    decoder.dateDecodingStrategy = .formatted(.apiNewsDateResult)

                    let apiResult = try? decoder.decode(Contact.self, from: jsonData)
                    return observer.onNext(apiResult!)
                } else {
                    return self.returnError(response: response, observer: observer)
                }
            })

            return Disposables.create()
        }
    }
올 레스 사 블룩

RxJS flatMapLatest에서와 똑같은 작업을 수행하는 연산자가 있습니다 switchMap.

여기에서 사용 예 를 찾을 수 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

bashrc에 해당하는 Busybox

분류에서Dev

"==="자바에 해당하는

분류에서Dev

Typescript에 해당하는 typedef

분류에서Dev

$ .each에 해당하는 Mootools

분류에서Dev

C #에 해당하는 jQuery

분류에서Dev

-rectypes에 해당하는 Haskell

분류에서Dev

Windows에 해당하는 chmod

분류에서Dev

HAVING에 해당하는 EXISTING

분류에서Dev

Python에 해당하는 JRE

분류에서Dev

dd에 해당하는 창

분류에서Dev

Swift에 해당하는 "? :"

분류에서Dev

curl에 해당하는 PowerShell

분류에서Dev

DATEVALUE에 해당하는 VBA?

분류에서Dev

SSH에 해당하는 Ping

분류에서Dev

current ()에 해당하는 XPath

분류에서Dev

bashrc에 해당하는 Busybox

분류에서Dev

$ @에 해당하는 Windows

분류에서Dev

Guice에 해당하는 ExceptionHandler

분류에서Dev

RxSwift에서 재시도 및 공유의 개념을 이해하는 데 도움이 필요합니다.

분류에서Dev

RxSwift는 Zip 연산자에서 관찰 가능합니다.

분류에서Dev

RxSwift를 사용하여 새로 고침 후 UIRefreshControl에 바인딩

분류에서Dev

RxSwift : flatMap 사용에 도움이 필요하고

분류에서Dev

C 또는 Python에 해당하는 NSScanner

분류에서Dev

RxSwift에 지연을 적용하는 방법은 무엇입니까?

분류에서Dev

RxSwift 및 Alamofire를 연결하는 비동기 요청에서 func 호출

분류에서Dev

URLSession 및 RxSwift를 사용하는 함수에 대한 단위 테스트 작성

분류에서Dev

비동기 완료 핸들러에서 리턴하는 RXSwift 플랫 맵

분류에서Dev

Swift에서 % @에 해당하는 Kotlin

분류에서Dev

Linux에서 _wsystem에 해당하는 것