Добро пожаловать в StackOverflow!
Для этого требуется довольно много операторов, и я бы порекомендовал посмотреть их на странице оператора ReactiveX , которую я проверяю каждый раз, когда забываючто-то.
Прежде всего, убедитесь, что MyModel
соответствует Decodable
, поэтому его можно построить из ответа JSON (см. Codable ).
let willEnterForegroundNotification = NotificationCenter.default.rx.notification(.UIApplicationWillEnterForeground)
let didEnterBackgroundNotification = NotificationCenter.default.rx.notification(.UIApplicationDidEnterBackground)
let myModelObservable = BehaviorRelay<MyModel?>(value: nil)
willEnterForegroundNotification
// discard the notification object
.map { _ in () }
// emit an initial element to trigger the timer immediately upon subscription
.startWith(())
.flatMap { _ in
// create an interval timer which stops emitting when the app goes to the background
return Observable<Int>.interval(10, scheduler: MainScheduler.instance)
.takeUntil(didEnterBackgroundNotification)
}
.flatMapLatest { _ in
return RxAlamofire.requestData(.get, yourUrl)
// get Data object from emitted tuple
.map { $0.1 }
// ignore any network errors, otherwise the entire subscription is disposed
.catchError { _ in .empty() }
}
// leverage Codable to turn Data into MyModel
.map { try? JSONDecoder().decode(MyModel.self, from: $0) } }
// operator from RxOptional to turn MyModel? into MyModel
.filterNil()
.bind(to: myModelObservable)
.disposed(by: disposeBag)
Затем, вы можете просто продолжить поток данных в ваши элементы пользовательского интерфейса.
myModelObservable
.map { $0.messagesCount }
.map { "\($0) messages" }
.bind(to: yourLabel.rx.text }
.disposed(by: disposeBag)
Я не запускал этот код, поэтому здесь могут быть некоторые опечатки / пропущенные преобразования, но это должно указать вам на правонаправление.Не стесняйтесь просить разъяснений.Если действительно новичок в Rx, я рекомендую просмотреть руководство Getting Started .Это великолепно!Rx очень мощный, но мне потребовалось некоторое время, чтобы понять.
Edit
Как указал @ daniel-t, при использовании Observable<Int>.interval
ведение бухгалтерии фона / переднего плана не требуется.1026 *