Добрый вечер, такой вопрос, на сколько адекватно внести логику в класс ячейки? Под логикой подразумевается обработка события и взаимодействия через класс service с сервером! или такие моменты не должны проявляться в таких, в принципе, не кто ведь не запрещает для класса ячейки прописать viewModel а оттуда делать запросы) Или это не этично в мире Свифт?!
На сколько адекватно вносить логику в Класс ячейки?
Не адекватно. Ячейка нужна только для отображения данных. Туда можно внести логику, которая влияет на анимацию, отображение данных и все. Все события с ячейки надо выносить наружу. Контроллеру, который и будет решать что делать при свайпах, тачах и пр.
Ячейки должны переиспользоваться в идеале. Поэтому хорошо если у них будет конфигуратор, который будет принимать не модель, а протокол даже. И данные раскидывать по аутлетам.
А если сделать отдельный класс VM для класса ячейки, а в ячейки сделать билдинг к VM, на такие вещи тоже табу?
Не знаю, в общем забиндил так)
viewModel.usersSubject
.bind(to: tableView.rx.items(cellIdentifier: AddUserCell.reuseIdentifier, cellType: AddUserCell.self)) {
[weak self] (row, element, cell) in
cell.configure(element: element)
cell.addButton.rx.tap.map{ _ in cell.model}
.bind(to: self!.viewModel.user)
.disposed(by: self!.bag)
}
.disposed(by: bag)
В случае с реактивщиной - ничего не скажу. Сам только начал эту тему копать. Но чисто логически, не хорошо когда ячейка кучу всего умеет. А что если ее надо будет переиспользовать?
Простой пример у меня был. Была доморощенная ячейка, где был и цвет и анимация заливки (процент заполнения) и текст и один лейбл показать, другой скрыть итп.
Туда передавал протокол, который все это заполнял. Тапов специфических не было, но если бы и были, я бы их вынес в контроллер.
В данном случае, может и нормально что ты на тап кнопки вешаешь связь с юзером.
Что точно нельзя делать, так это force unwrap. Напиши после in
:
guard let sSelf = self else { return }
и дальше используй sSelf
, а не self!
.
И в твоем случае, сама ячейка логики не содержит. Ты же этот метод пишешь в контроллере. Верно?
Да, верно)
Я просто думал для ячейки сделать класс viewModel и пустить с button связь к нему, а в View model вызывать метод из класса что с сервером общается, а потом попробовал с биндить все в контроллере и оно сработало, по крайним мерам пока на ошибки не напоролся)
Я понимаю, просто вот в каком случае self может не существовать? всю жизнь небезопасно анвраплю в слабых ссылках self и не разу не сталкивался с ошибкой из-за этого, вот честно)
Вот столкнусь однажды и может начну, а пока это будет лишний код) Либо может у тебя был опыт ошибок на этом) тогда делись
используйте тогда [unowned self] и не нужно тогда принудительно извлекать опционал.
но лучше всего использовать [weak self] … self?..
Вот тут я натыкался на ошибку, он ведь вроде живет либо столько же сколько, либо больше, и была на памяти с ним ошибка, как у меня так и у коллеги) Но вот ей богу не помню в чем именно, а с weak всегда все хорошо проходило, но опять же, если наткнусь, то изменю подход)
У меня был случай когда я ошибку выхватил. Было связано с переходами на другие контроллеры.
Поэтому проще перестраховаться. Хотя если все в рамках одного контроллера работает, то пользуй тогда [unowned self]
так в этом и суть, что я обжигался на нем) Нужно сначала разобраться будет что к чему и когда уместно использовать первое или второе) Так как пока знания этого момента основаны только на оф. документации) А каких-то опытных исследований не проводил, чтобы прям понять понять)