RxSwift получает значение от одного элемента в наблюдаемой последовательности

Я пытаюсь постепенно преобразовать свое приложение в RxSwift / MVVM. Но мне кажется, что я кое-что делаю неправильно.

В этом примере у меня есть статическая таблица с этой конкретной информацией.

    let itens = Observable.just([
        MenuItem(name: GlobalStrings.menuItemHome,      nameClass: "GPMainVC"),
        MenuItem(name: GlobalStrings.menuItemProfile,   nameClass: "GPMainVC"),
        MenuItem(name: GlobalStrings.menuItemLevels,    nameClass: "GPLevelsVC"),
    ])

Мне нужно знать модель (MenuItem) и индекс, когда пользователь выбирает ячейку, но у меня возникают проблемы с этим

 tableView.rx
        .itemSelected
        .map { [weak self] indexPath in
            return (indexPath, self?.modelView.itens.elementAt(indexPath.row))
        }
        .subscribe(onNext: { [weak self] indexPath, model in

            self?.tableView.reloadData()

            //can´t get MenuItem because model its a observable
            //self?.didSelect((indexPath as NSIndexPath).row, name.nameClass)

        })
        .addDisposableTo(disposeBag)

заранее спасибо


person DaSilva    schedule 14.10.2016    source источник
comment
Действительно ли ваша itens является последовательностью (потому что это то, что на самом деле представляют собой наблюдаемые, то есть последовательности событий, за которыми вы можете наблюдать)? Судя по всему, itens - это просто своего рода словарь, который вы хотите использовать для поиска MenuItem. В таком случае не следует делать из этого наблюдаемое.   -  person 0x416e746f6e    schedule 14.10.2016
comment
спасибо за ответ @Anton Bronnikov. Но что вы предлагаете использовать вместо этого?   -  person DaSilva    schedule 14.10.2016


Ответы (1)


Вам необходимо сделать следующие шаги:

  1. Используйте переменную. Думаю, это лучшее решение в твоей ситуации.

    let itens = Variable([
        MenuItem(name: GlobalStrings.menuItemHome, nameClass: "GPMainVC"),
        MenuItem(name: GlobalStrings.menuItemProfile, nameClass: "GPMainVC"),
        MenuItem(name: GlobalStrings.menuItemLevels, nameClass: "GPLevelsVC"),
    ])
    
  2. Используйте следующий код, если вы хотите получить индекс и модель из ячейки, по которой щелкнули мышью.

    tableView.rx
    .itemSelected
    .map { index in
        return (index, self.items.value[index.row])
    }
    .subscribe(onNext: { [weak self] index, model in
        // model is MenuItem class
    })
    .addDisposableTo(disposeBag)
    

    Надеюсь, мой ответ был для вас очень полезным. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация о возможностях RxSwift в вашей задаче. Удачи!

person Svyatoslav    schedule 17.10.2016
comment
Большое спасибо @Svyatoslav. Но мне нужен и индекс, и модель. Вот почему я пытался использовать оператор itemSelected. Есть идеи, как этого добиться? Спасибо - person DaSilva; 17.10.2016
comment
@DaSilva, я только что исправил свой ответ. Проверьте пожалуйста. - person Svyatoslav; 17.10.2016
comment
@DaSilva, пожалуйста, не забудьте отметить мой ответ как правильный, если он решил вашу проблему. - person Svyatoslav; 17.10.2016
comment
Еще раз спасибо за ответ. Но с let itens = Variable я потерял возможность использовать tens.bindTo - person DaSilva; 18.10.2016
comment
@DaSilva, вы должны использовать items.asObservable (). BindTo (). - person Svyatoslav; 18.10.2016