2017-09-24 84 views
0

我有以下代码:RxSwift跟踪多个观测活动

let categoriesRequest = APIService.MappableRequest(Category.self, resource: .categories) 
let categoriesRequestResult = api.subscribeArrayRequest(categoriesRequest, from: actionRequest, disposedBy: disposeBag) 

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

let categoriesUpdateData = DatabaseService.UpdateData(newObjectsObservable: newCategories) 
let categoriesDatabaseResult = database.subscribeUpdates(from: categoriesUpdateData, disposedBy: disposeBag) 

let latestTopicsRequest = APIService.MappableRequest(Topic.self, resource: .latestTopics) 
let latestTopicsRequestResult = api.subscribeArrayRequest(latestTopicsRequest, from: actionRequest, disposedBy: disposeBag) 

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

let latestTopicsUpdateData = DatabaseService.UpdateData(newObjectsObservable: newLastTopics) 
let latestTopicsDatabaseResult = database.subscribeUpdates(from: latestTopicsUpdateData, disposedBy: disposeBag) 

有来自同一个开始发布主题actionRequest两个请求,这些请求经过两次数据库更新。

我需要类似isActive的bool值,如果有任何api /数据库任务正在进行,将返回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 
} 

感谢。

回答

0

实测值以下溶液:通过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与.trackActivity(indicator)使用它进入flatMapLatest等。

然后使用API​​ /数据库的方法是这样的:

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观察到的是我需要的。