【问题标题】:Observable returned from function never sends onNext从函数返回的 Observable 从不发送 onNext
【发布时间】:2017-01-05 06:14:06
【问题描述】:

我有并且 observable 永远不会发送 onNext 如果它由函数返回,但如果我在返回它的函数中订阅它,则调用 onNext。

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))
            })
    }   
}

但如果我这样做

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

在 UserService 中,我会得到下一个事件。

我尝试在 InfoViewModel 中的 observable 上使用 debug(),有一个订阅,我只是从未收到任何事件。

【问题讨论】:

  • 添加了行号,我认为图像可以更好地显示这两个文件。
  • meta.stackoverflow.com/questions/285551/… 我只是想帮助您更快地回答您的问题^^
  • 会尽快c/p代码
  • Observables 不提供值,除非您订阅它们。他们就是这样工作的。
  • 我在 InfoViewModel 中所做的工作,我了解冷热可观察对象。

标签: swift rx-swift reactive


【解决方案1】:

所以我想通了,我在方法内部创建了 RxMoyaProvider,所以一旦我走出方法的范围,它就会被释放。这意味着当订阅它时,它无法再创建请求。这不会失败的原因是因为 observable 是如何创建的

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()
            }
        }
    }

如您所见,该请求在订阅时被调用,但由于 self 已被释放,该请求从未被触发。我得到的只是一个空的 observable。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-19
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多