RxSwift: onDisposed activated before Alamofire return data
Try to keep a strong reference to disposbag
like this:
let disposeBag = DisposeBag()
func setupRx() {
getArticles(articlesReq).observeOn(MainScheduler.instance)
.subscribe(onNext: {
print("onNext")
// ... use $0 parameter
}, onError: {
print("onError")
// ... use $0 parameter
}, onCompleted: {
print("onCompelete")
}, onDisposed: nil)
.addDisposableTo(disposeBag)
}
Your disposeBag
should live longer than response.
Hope this may help.
RxSwift and Alamofire: can't subscribe events after alamofire handling response data
Try to keep a strong reference to disposbag
like this:
let disposeBag = DisposeBag()
func setupRx() {
toObservable()
.debug("Alamofire.request")
.subscribe(onNext: {
print("onNext")
// ... use $0 parameter
}, onError: {
print("onError")
// ... use $0 parameter
}, onCompleted: {
print("onCompelete")
}, onDisposed: nil)
.addDisposableTo(disposeBag)
}
And you can use debug
operator to see what happened.
Hope this may help.
RxSwift+Alamofire custom mapper error handling
You can use materialize function in rxSwift. It will convert any Observable into an Observable of its events. So that you will be listening to Observable<Event<Int>>
than Observable<Int>
. Any error thrown from the flatmap would be captured as error event in your subscription block's onNext and can be handled there. And your subscription would still be alive. Sample code would be as follows.
button.rx.tap.flatMap { _ in
return Observable.just(0)
.flatMap { _ -> Observable<Int> in
provider.login()
}.materialize()
}.subscribe(onNext: { event in
switch event {
case .next:
if let value = event.element {
print(value) //You will be getting your value here
}
case .error:
if let error = event.error {
print(error.localizedDescription) //You will be getting your captured error here
}
case .completed:
print("Subscription completed")
}
}) {
print("Subscription disposed")
}.disposed(by: disposeBag)
Hope it helps. You can checkout the materialize extension here.
call func in Asynchronous requests chaining RxSwift and Alamofire
Dale's answer works but I would be inclined to move the saves into do
operators instead. Like this:
networkManagerShareCore.share.login(param: param)
.do(onNext: { [weak self] resMessageModel in
self?.saveData(resMessageModel)
})
.flatMap { _ in
networkManagerShareCore.share.me()
}
.do(onNext: { [weak self] resMeModel in
self?.saveData(resMeModel)
})
.flatMap { resMeModel in
networkManagerShareCore.share.entitie(entityId: "\(resMeModel.data.personId!)")
}
.subscribe(
onNext: { (model) in
print(model)
},
onError: { (error) in
self.errorMsg.accept(error.localizedDescription)
self.isSuccess.accept(false)
},
onCompleted: nil,
onDisposed: {
print("Disposed")
}
)
.disposed(by: disposeBag)
Related Topics
Nsdatepicker in Nsstatusbar Nssmenuitem Not Receiving Input
Move Button When Keyboard Appears Swift
How to Print Http Request to Console
"'Init' Is Deprecated" Warning After Swift4 Convert
Which Optimization Level Should I Choose for Release
A Concise Way to Not Execute a Loop Now That C-Style for Loops Are Going to Be Removed from Swift 3
Decoding a Nested Array in Swift 4
Remove from Array of Anycancellable When Publisher Finishes
How to Update UIviewrepresentable with Observableobject
What Was The Reason for Swift Assignment Evaluation to Void
When How to Start Submitting Apps to The iOS App Store Written Using The Swift Programming Language
Is There a Method to Check The UIcollectionview Item Drag Cancellation If The Item Wasn't Moved
Xcode Failed to Resolve Dependency Firebase - Googleappmeasurement Does Not Match Requirement
More Precision Than Double in Swift
Why Does Compactmap Return a Nil Result
Detecting End of The Playback in Avaudioplayer
Ambiguous Use of 'Filter' When Converting Project to Swift 4