Rxswift: Ondisposed Activated Before Alamofire Return Data

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



Leave a reply



Submit