Наблюдаемый статус сети RxSwift

У меня есть метод getProducts в моей модели представления:

struct MyViewModel {
    func getProducts(categoryId: Int) -> Observable<[Product]> {
        return api.products(categoryId: categoryId)
    }
    var isRunning: Observable <Bool> = {
        ...
    }
}

api.products - это частная переменная, которая использует URLSession rx расширение: session.rx.data(...) в фоновом режиме.

Я хотел бы иметь некоторого наблюдателя isRunning в моей модели представления, на который я мог бы подписаться, чтобы знать, выполняет ли он сетевой запрос.

Могу ли я это сделать, не внося никаких поправок в свой класс api?

Я новичок в реактивном программировании, поэтому любая помощь будет оценена по достоинству.

Спасибо.


person Greg    schedule 12.06.2017    source источник


Ответы (1)


Вот решение с использованием вспомогательного класса, написанного авторами RxSwift в Примеры RxSwift под названием ActivityIndicator.

Идеи просты

struct MyViewModel {
    /// 1. Create an instance of ActivityIndicator in your viewModel. You can make it private
    private let activityIndicator = ActivityIndicator()

    /// 2. Make public access to observable part of ActivityIndicator as you already mentioned in your question
    var isRunning: Observable<Bool> {
        return activityIndicator.asObservable()
    }

    func getProducts(categoryId: Int) -> Observable<[Product]> {
        return api.products(categoryId: categoryId)
            .trackActivity(activityIndicator) /// 3. Call trackActivity method in your observable network call
    }
}

В связанном ViewController теперь вы можете подписаться на свойство isRunning. Например:

    viewModel.isLoading.subscribe(onNext: { loading in
        print(loading)
    }).disposed(by: bag)
person Nimble    schedule 12.06.2017
comment
Что мне нужно импортировать, чтобы иметь возможность вызывать trackActivity на моем наблюдаемом объекте? - person Greg; 12.06.2017
comment
Исходный файл ActivityIndicator (ссылка размещена в моем ответе) уже содержит метод trackAcytivity как часть расширения ObservableConvertibleType. - person Nimble; 12.06.2017
comment
Спасибо, это то, что я искал. - person Greg; 12.06.2017