2017-01-03 9 views
0

Вот некоторые из моих кодов:RxSwift и Alamofire: не могут подписаться события после того, как данные отклика обработки alamofire

func toObservable() -> Observable<T> { 
    return Observable.create { 
     observer -> Disposable in 
     let urlRequest = try? self.asURLRequest() 

     Alamofire.request(urlRequest!) 
      .responseObject{ (response: DataResponse<T>) in 
       if response.result.isSuccess { 
        if let responseEntity = response.result.value { 
         if let _ = responseEntity.error { 
          observer.onError(ResponseError.generic) 
         } else { 
          observer.onNext(responseEntity) 
         } 
        } else { 
         // TODO 
        } 
       } else { 
        // TODO 
       } 
     observer.onCompleted() 

     } 

     return Disposables.create() 
    } 
} 

и когда я называю эту функцию:

toObservable().subscribe(onNext: { 
      print("onNext") 
      // ... use $0 parameter 
     }, onError: { 
      print("onError") 
      // ... use $0 parameter 
     }, onCompleted: { 
      print("onCompelete") 
     }, onDisposed: nil) 
    .addDisposableTo(DisposeBag()) 

Он просто не может печатать что-нибудь. Итак, любая идея об этом? Большое спасибо!

(я использовал AlamofireObjectMapper, рамки RxSwift)

Тот же вопрос будет here, но никто не ответил.

ответ

3

Попробуйте сохранить сильную ссылку на disposbag так:

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) 

} 

И вы можете использовать debug оператор, чтобы увидеть, что произошло.

Надеюсь, это поможет.

+0

Спасибо так много. Я потратил часы на эту проблему. Это, если вы можете объяснить, почему это имеет смысл, не может быть лучше :) – wizChen

+1

@wizChen Хорошо, задача будет продолжаться до тех пор, пока 'disposeBag' deinit, Если вы сохраните сильную ссылку на' disposbag', задача будет активирована. Таким образом, этот одиночный код '.addDisposableTo (DisposeBag())' немедленно отменит задачу. – beeth0ven

+0

Так что это объясняет, еще раз спасибо! – wizChen

0
let disposeBag = DisposeBag() 

addDisposable осуждался ..

func setupRx() { 

    toObservable() 
     .debug("Alamofire.request") 
     .subscribe(onNext: { 
      print("onNext") 
     // ... use $0 parameter 
     }, onError: { 
      print("onError") 
     // ... use $0 parameter 
     }, onCompleted: { 
      print("onCompelete") 
     }, onCompleted: { 
     print("onCompelete") 
     }).disposed(by: disposeBag) 

}