Observable returned from function never sends onNext

1k Views Asked by At

I have and observable that never sends onNext if its returned by a function, but if i subscribe to it in the function that returns it, onNext is called.

class InfoViewModel {

    func refreshPushToken() {

        PushNotificationService.sharedInstance.pushToken!
                .flatMapLatest { (pushToken: String) -> Observable<Result<User>> in
                    return UserService.registerPushToken(pushToken)
                }
                .subscribe { (event ) in
                    print(event)
                }
                .addDisposableTo(disposeBag)

    }
}

struct UserService {
    ....
    static func registerPushToken(_ pushToken: String) -> Observable<Result<User>> {
        ...
        return self.postUser(user: user)
    }

    static fileprivate func postUser(user: User) -> Observable<Result<User>> {

        let rxProvider: RxMoyaProvider<Backend> = RxMoyaProvider<Backend>(endpointClosure: Backend.endpointClosure)

         return rxProvider.request(Backend.register(user: user))
            .mapObject(type: User.self)
            .map({ (user: User) -> Result<User> in
                LogService.log(level: .debug, action: "postUser", message: "Posted user with success", parameters: ["user": user.deviceId])
                return .success(user)
            })
            .catchError({ error -> Observable<Result<User>> in
                LogService.log(level: .error, action: "postUser", message: "Error posting user", parameters: ["user": user.deviceId, "error": error.localizedDescription])
                return Observable.just(.failure(error))
            })
    }   
}

But if I do this

     rxProvider.request(Backend.register(user: user))
     ...
        .subscribe { (event ) in
            print(event)
        }

in the UserService, i will get a next event.

I have tried to use debug() on the observable in InfoViewModel, there is a subscription, i just never receive any events.

1

There are 1 best solutions below

0
On BEST ANSWER

So i figured it out, I was creating the RxMoyaProvider inside the method, so as soon as i went out of the scope of the method, it was deallocated. Which means that when was subscribing to it, it could no longer create the request. The reason that this wouldn't fail is because of how the observable is created

open func request(_ token: Target) -> Observable<Response> {

        // Creates an observable that starts a request each time it's subscribed to.
        return Observable.create { [weak self] observer in
            let cancellableToken = self?.request(token) { result in
                switch result {
                case let .success(response):
                    observer.onNext(response)
                    observer.onCompleted()
                case let .failure(error):
                    observer.onError(error)
                }
            }

            return Disposables.create {
                cancellableToken?.cancel()
            }
        }
    }

As you can see, the request is called upon subscription, but since self had been deallocated the request was never fired. And all i got back was an empty observable.