Привязать наблюдаемый результат RxSwift к другим наблюдаемым - PullRequest
2 голосов
/ 11 ноября 2019

У меня есть наблюдаемая, которая управляет объектом с именем Profile:

class Profile {
    let name. : String
    let surname : String
    let avatar: String?
}
Observable<Profile>

Эта наблюдаемая связана с моделью просмотра, которая имеет одновременно наблюдаемое свойство, называемое

* 1006. *

Это начальные буквы имени и фамилии. Эти начальные буквы отображаются в том случае, если свойство аватара равно nil.

У меня есть функция, которая возвращает начальные буквы в строке:

func initialLetters(first:String, second: String) -> String

Как я могу добиться этого с помощью RxSwift любых операторов,to:

  1. Доступ к свойству аватара.
  2. Проверьте, имеет ли оно значение nil.
  3. , если оно равно nil, вызовите функцию initialLetters.
  4. Функция привязкиinitialLetters для наблюдаемых initialLetters.

Большое спасибо.

Ответы [ 2 ]

2 голосов
/ 11 ноября 2019

Это просто простое отображение ...

Здесь это как собственная модель представления.

func initialMarks(for profile: Observable<Profile>) -> Observable<String> {
    return profile
        .compactMap { profile in
            if profile.avatar == nil {
                return initialLetters(first: profile.name, second: profile.surname)
            }
            else {
                return nil
            }
        }
}

Если вы хотите встроить ее в структуру / класс модели представления, выможет сделать что-то вроде:

struct ViewModel {
    let profile: Observable<Profile>

    var initialMarks: Observable<String> {
        return profile
            .map { profile in
                if profile.avatar == nil {
                    return initialLetters(first: profile.name, second: profile.surname)
                }
                else {
                    return ""
                }
            }
    }
}

Кроме того, две реализации выше слегка различаются в зависимости от того, что вы хотите ... В первой она инициализирует только инициалы, когда аватар ноль, вторая выдаетпустая строка, когда аватар существует, или инициалы, когда аватар в nil.

0 голосов
/ 11 ноября 2019

Для этого конкретного примера вам нужно использовать PublishSubject , чтобы вы могли связать свой поток initialMarksSubject и наблюдать за ним как Observable

Настройка

private var initialMarksSubject = PublishSubject<String>()
private let disposeBag = DisposeBag()

private func observeInitialMarks() {
    profileObservable
        .filter { $0.avatar == nil } // only take elements that have a nil avatar
        .map { self.initialLetters(first: $0.name, second: $0.surname) } // transform profile to initialLetters of type String
        .bind(to: initialMarksSubject) // bind the stream to your subject
        .disposed(by: disposeBag)
}

var initialMarks: Observable<String> {
    return initialMarksSubject.asObservable()
}

Объяснение

Вызов observeInitialMarks() будет:

  1. Подписаться на profileObservable
  2. Принять толькопрофили, которые не имеют avatar
  3. Преобразование профиля в initialLetters
  4. Привязка событий к initialMarksSubject

Подписка на initialMarks вернетинформация, которую нужно отобразить для вашего пользовательского интерфейса

Использование для вашего компонента пользовательского интерфейса

viewModel.initialMarks
    .observeOn(MainScheduler.instance)
    .bind(to: profileLabel.rx.text)
    .disposed(by: disposeBag)
...