2017-04-15 43 views
2

我不能設法讓這個解決方案的工作: https://github.com/liuznsn/RxMoyaPaginationNetworkingRxSwift分頁

也許有人可以告訴我哪裏是錯誤的。加載變量永遠不會變爲false。我猜這個問題在請求中是可觀察的,但我找不到原因。

class PaginationNetworkModel<T1: Mappable>: NSObject { 

let refreshTrigger = PublishSubject<Void>() 
let loadNextPageTrigger = PublishSubject<Void>() 
let loading = Variable<Bool>(false) 
let elements = Variable<[T1]>([]) 
var offset:Int = 0 
let error = PublishSubject<Swift.Error>() 

private let disposeBag = DisposeBag() 

override init() { 
    super.init() 

    let refreshRequest = loading.asObservable() 
     .sample(refreshTrigger) 
     .flatMap { [unowned self] loading -> Observable<[T1]> in 
      if loading { 
       return Observable.empty() 
      } else { 
       return self.loadData(offset: self.offset) 
      } 
    } 

    let nextPageRequest = loading.asObservable() 
     .sample(loadNextPageTrigger) 
     .flatMap { [unowned self] loading -> Observable<[T1]> in 
      if loading { 
       return Observable.empty() 
      } else { 
       self.offset += 1 
       return self.loadData(offset: self.offset) 
      } 
    } 

    let request = Observable 
     .of(refreshRequest, nextPageRequest) 
     .merge() 
     .shareReplay(1) 

    let response = request.flatMap { events -> Observable<[T1]> in 
     request 
      .do(onError: { error in 
       self.error.onNext(error) 
      }).catchError({ error -> Observable<[T1]> in 
       Observable.empty() 
      }) 
    }.shareReplay(1) 

    Observable 
     .combineLatest(request, response, elements.asObservable()) { [unowned self] request, response, elements in 
      return self.offset == 0 ? response : elements + response 
     } 
     .sample(response) 
     .bind(to: elements) 
     .addDisposableTo(rx_disposeBag) 

    Observable 
     .of(request.map { _ in true }, 
      response.map { $0.count == 0 }, 
      error.map { _ in false } 
     ) 
     .merge() 
     .bind(to: loading) 
     .addDisposableTo(rx_disposeBag) 
} 

func loadData(offset: Int) -> Observable<[T1]> { 
    return Observable.empty() 
} 
+0

你意識到你'loadData'功能不會返回任何數據,意味着'響應'永遠不會開火? –

+0

是的。正如你可以看到它的泛型類,如果我需要其他服務器方法,我繼承這個類。我確信響應火災,即如果我將request.map設置爲false,我將從服務器獲取所有對象,但沒有「加載」功能。 – pluck

+0

由於某種原因,在response.map後調用了request.map,其中sets設置爲false,並立即設置爲請求的真實請求,但我無法看到它在響應後被調用的位置 – pluck

回答

3

的問題是在這裏:

let refreshRequest: Observable<[T1]> = loading.asObservable() 
     .sample(refreshTrigger) 
     .flatMap { [unowned self] loading -> Observable<[T1]> in 
      if loading { 
       return Observable.empty() 
      } else { 
       return self.loadData(offset: self.offset) 
      } 
    } 

refreshRequest未發出的值,直到 loadData回報。您的代碼結構的方式,在refreshTrigger上發出信號將啓動網絡請求,然後在網絡請求完成後將加載設置爲true。

如果refreshRequestnextPageRequest返回一個可加載頁的可觀察值,然後將它們合併並將flatMap與網絡調用合併後的結果進行調用將會更好。

3

謝謝丹尼爾的幫助,在這裏完成的解決方案

調用示例:

goodsModel = GoodsNetworkModel() 
    goodsModel.elements.asObservable().bind(to: tableView.rx.items(cellIdentifier: "Cell", cellType: StoreCell.self)) { (ip, item: Goods, cell: StoreCell) in 
     cell.configure(goods: item) 
    }.addDisposableTo(rx_disposeBag) 

    tableView.rx.itemSelected.bind() { [unowned self] ip in 
     self.didSelectRow(ip: ip.row) 
    }.addDisposableTo(rx_disposeBag) 

    rx.sentMessage(#selector(UIViewController.viewDidAppear(_:))) 
     .map { _ in() } 
     .bind(to: goodsModel.refreshTrigger) 
     .addDisposableTo(rx_disposeBag) 

    tableView.rx_reachedBottom 
     .map{ _ in()} 
     .bind(to: goodsModel.loadNextPageTrigger) 
     .addDisposableTo(rx_disposeBag) 

型號代碼:

class PaginationNetworkModel<T1: Mappable>: NSObject { 

let refreshTrigger = PublishSubject<Void>() 
let loadNextPageTrigger = PublishSubject<Void>() 
let loading = Variable<Bool>(false) 
let elements = Variable<[T1]>([]) 
var offset:Int = 0 
let error = PublishSubject<Swift.Error>() 

private let disposeBag = DisposeBag() 

override init() { 
    super.init() 

    let refreshRequest = loading.asObservable() 
     .sample(refreshTrigger) 
     .flatMap { loading -> Observable<Int> in 
      if loading { 
       return Observable.empty() 
      } else { 
       return Observable<Int>.create { observer in 
        observer.onNext(0) 
        observer.onCompleted() 
        return Disposables.create() 
       } 
      } 
    } 

    let nextPageRequest = loading.asObservable() 
     .sample(loadNextPageTrigger) 
     .flatMap { [unowned self] loading -> Observable<Int> in 
      if loading { 
       return Observable.empty() 
      } else { 
       return Observable<Int>.create { [unowned self] observer in 
        self.offset += 1 
        observer.onNext(self.offset) 
        observer.onCompleted() 
        return Disposables.create() 
       } 
      } 
    } 

    let request = Observable 
     .of(refreshRequest, nextPageRequest) 
     .merge() 
     .shareReplay(1) 

    let response = request.flatMap { offset -> Observable<[T1]> in 
     self.loadData(offset: offset) 
      .do(onError: { [weak self] error in 
       self?.error.onNext(error) 
      }).catchError({ error -> Observable<[T1]> in 
       Observable.empty() 
      }) 
     }.shareReplay(1) 

    Observable 
     .combineLatest(request, response, elements.asObservable()) { [unowned self] request, response, elements in 
      return self.offset == 0 ? response : elements + response 
     } 
     .sample(response) 
     .bind(to: elements) 
     .addDisposableTo(rx_disposeBag) 

    Observable 
     .of(request.map{_ in true}, 
      response.map { $0.count == 0 }, 
      error.map { _ in false }) 
     .merge() 
     .bind(to: loading) 
     .addDisposableTo(rx_disposeBag) 
} 

func loadData(offset: Int) -> Observable<[T1]> { 
    return Observable.empty() 
} 
+0

如果我創建PaginationNetworkModel, loadNextPageTrigger',模型將嘗試加載第1頁,而不曾嘗試加載第0頁。你確定這是正確的行爲嗎? –

+0

編輯我的答案,所以在調用loadNextPageTrigger之前,我總是調用refreshTrigger – pluck