Измените значение объекта внутри Observable последовательности, используя RxSwift - PullRequest
0 голосов
/ 16 сентября 2018

У меня есть наблюдаемая последовательность, которая представляет мои отображаемые сеансы следующим образом:

 private let displayedSessions =
 PublishSubject<[ProgramDaySessionsModels.ViewModels.Session]>()

А вот моя ViewModel:

struct ViewModels {

        struct Session{
            let id : Int?
            let title : String?
            let location : String?
            var isAddedToCalendar : Bool?
            var isAddedToFavorite : Bool?
            let time : String?
        }
    }

Отображаемые сеансы привязываются к табличному представлению:

func setupCellBinding(){
    displayedSessions
        .asObservable()
        .bind(to:
            tableView
                .rx
                .items(cellIdentifier:
                    R.reuseIdentifier.programDaySessionCell.identifier,
                       cellType: ProgramDaySessionCell.self)
        ){
            ( row, element, cell ) in

            cell.setup(withViewModel: element)
        }
        .disposed(by: disposeBag)
}

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

Я хочу после этого обновить отображаемую модель представления, например, я хочу изменить свойство isAddedToCalendar на false / true, когда логика подписки заканчивается ...

У меня вопрос, как обновить или изменить значение, хранящееся в Subject без вызова оператора onNext

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

ReactiveX - это функциональная парадигма . Вы не «изменяете свойство», а передаете новое свойство.

Вы можете приблизиться к тому, что хотите, если ваш начальный массив будет Observable of Observables Observable<[Observable<Session>]>. Затем вы можете протолкнуть новый сеанс через один элемент, не проталкивая весь массив. Справедливое предупреждение, тем не менее, это может быстро стать кошмаром для менеджмента.


Лучше, я думаю, будет иметь Observable<[Int]>, который содержит идентификаторы сеансов и используется для заполнения tableView и отдельный Observable<[Int: Observable<Session>]> для ссылки на значения в каждой ячейке.

Каждая ячейка получает идентификатор из первой наблюдаемой и использует этот идентификатор для поиска и подписки на свой сеанс во второй. Обновление наблюдаемого в словаре не приведет к перезагрузке всего табличного представления.

Все еще сложно управлять. Возможно, вместо этого сделайте словарь Observable<[Int: Session]>, сделайте ваши сессии сравнимыми и используйте distintUntilChanged(), чтобы избежать перезагрузки ячейки, если что-то не изменилось в этом конкретном сеансе.

Также см. Мой ответ здесь: RxSwift: управление обновлениями объектов в приложении

0 голосов
/ 16 сентября 2018

Вы не можете.

Это очень странное заблуждение, которое имеют люди, использующие Rx, поэтому важно подчеркнуть:

Subject с и Observable с в целом НЕ имеют значения , так как наблюдаемый является потоком значений и не представляет отдельное значение.

Добавление значения в тему выполняется с использованием onNext (или .on(.next...)) в соответствии со стандартами ReactiveX.

Тот факт, что вы думаете, что значение должно быть отделено от событий onNext, заставляет меня думать, что вам нужно вернуться к основам и прочитать некоторую документацию по Rx / ReactiveX / RxSwift, чтобы понять основные понятия наблюдаемых потоков .

Удачи!

...