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] 삭제
몇 마디 만하겠습니다