2017-01-02 76 views
0

我有和可观察,如果它由函数返回,它永远不会发送onNext,但如果我在它返回它的函数中订阅它,onNext被调用。从函数返回的Observable永远不会发送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)) 
      }) 
    } 
} 

但是,如果我在UserService不需要这个

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

,我会得到下一个事件。

我曾试着在InfoViewModel的observable上使用debug(),这里有一个订阅,我从来没有收到任何事件。

+0

添加行号,我认为图像可以更好地显示两个文件。 –

+0

http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-question 我只是想帮助您可以更快地回答您的问题^^ – Keiwan

+0

尽快c/p代码 –

回答

0

所以我想通了,我在方法里面创建了RxMoyaProvider,所以只要我离开了方法的范围,它就被释放了。这意味着当订阅它时,它不能再创建请求。这会不会失败的原因是怎样的观察的创建

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已经释放了从来没有发射的要求。我回来的时候是一个空的可观察的。

相关问题