2017-09-24 3 views
0

を追跡します。RxSwiftは、私は、コードを次している複数の観測活動

私はisActiveのようなものが必要です.bool値は、api/databaseタスクのいずれかが進行中の場合はtrueを返します。出来ますか? RxSwiftの例ではActivityIndicatorを見ましたが、私の場合はそれを使用することは可能ですか? API /データベースから

コード必要に応じて:

// API 
func subscribeArrayRequest<T>(_ request: MappableRequest<T>, 
           from triggerObservable: Observable<Void>, 
           disposedBy disposeBag: DisposeBag) -> Observable<Event<[T]>> { 
    let result = ReplaySubject<Event<[T]>>.create(bufferSize: 1) 

    triggerObservable 
     .flatMapLatest { 
      SessionManager 
       .jsonArrayObservable(with: request.urlRequest, isSecured: request.isSecured) 
       .mapResponse(on: APIService.mappingSheduler) { Mapper<T>().mapArray(JSONArray: $0) } 
       .materialize() 
     } 
     .subscribe(onNext: { [weak result] event in 
      result?.onNext(event) 
     }) 
     .disposed(by: disposeBag) 

    return result 
} 

// Database 
func subscribeUpdates<N, P>(from data: UpdateData<N, P>, disposedBy disposeBag: DisposeBag) -> Observable<Void> { 
    let result = PublishSubject<Void>() 

    data.newObjectsObservable 
     .observeOn(DatabaseService.writingSheduler) 
     .subscribe(onNext: { [weak result] newObjects in 
      // update db 

      DispatchQueue.main.async { 
       result?.onNext(()) 
      } 
     }) 
     .disposed(by: disposeBag) 

    return result 
} 

感謝。サービスメソッドにActivityIndicatorインスタンスを渡すと、このようにそれを使用します:

func bindArrayRequest<T>(_ request: MappableRequest<T>, 
         from triggerObservable: Observable<Void>, 
         trackedBy indicator: RxActivityIndicator, 
         disposedBy disposeBag: DisposeBag) -> Observable<Event<[T]>> { 
    let result = ReplaySubject<Event<[T]>>.create(bufferSize: 1) 

    triggerObservable 
     .flatMapLatest { 
      SessionManager 
       .jsonArrayObservable(with: request.urlRequest, isSecured: request.isSecured) 
       .mapResponse(on: APIService.mappingSheduler) { Mapper<T>().mapArray(JSONArray: $0) } 
       .materialize() 
       .trackActivity(indicator) 
     } 
     .bind(to: result) 
     .disposed(by: disposeBag) 

    return result 
} 

も観測可能にするデータベースの更新ロジックをラップし、APIのようflatMapLatest.trackActivity(indicator)でそれを使用するソリューション以下見つかり

答えて

0

let indicator = RxActivityIndicator() 
isUpdatingData = indicator.asObservable() // needed bool observable 

let categoriesRequest = APIService.MappableRequest(Category.self, resource: .categories) 

let categoriesRequestResult = 
    api.bindArrayRequest(categoriesRequest, 
         from: actionRequest, 
         trackedBy: indicator, 
         disposedBy: disposeBag) 

let newCategories = categoriesRequestResult 
    .map { $0.element } 
    .filterNil() 

let categoriesUpdateData = DatabaseService.UpdateData(newObjectsObservable: newCategories) 

let categoriesDatabaseResult = 
    database.bindUpdates(from: categoriesUpdateData, 
         trackedBy: indicator, 
         disposedBy: disposeBag) 

let latestTopicsRequest = APIService.MappableRequest(Topic.self, resource: .latestTopics) 

let latestTopicsRequestResult = 
    api.bindArrayRequest(latestTopicsRequest, 
         from: actionRequest, 
         trackedBy: indicator, 
         disposedBy: disposeBag) 

let newLastTopics = latestTopicsRequestResult 
    .map { $0.element } 
    .filterNil() 

let latestTopicsUpdateData = DatabaseService.UpdateData(newObjectsObservable: newLastTopics) 

let latestTopicsDatabaseResult = 
    database.bindUpdates(from: latestTopicsUpdateData, 
         trackedBy: indicator, 
         disposedBy: disposeBag) 

isUpdatingData観察できるが、私は必要なものである:

次に、このようなAPI /データベースメソッドを使用します。

関連する問題