Прежде всего, ваш взгляд не должен запрашивать данные у Ведущего - это нарушение архитектуры VIPER.
Вид является пассивным. Он ждет, пока Презентатор предоставит ему контент для отображения; он никогда не запрашивает у Ведущего данные.
Что касается вопросов: Лучше сохранить текущее состояние просмотра в Presenter, включая все данные. Потому что он обеспечивает связь между частями VIPER на основе состояния.
Но в другом случае докладчик ничего не должен знать о UIKit, поэтому UITableViewDataSource и UITableViewDelegate должны быть частью слоя «Вид».
Чтобы сохранить ViewController в хорошей форме и сделать это с помощью «ТВЕРДОГО» способа, лучше хранить DataSource и делегировать в отдельных файлах. Но эти детали по-прежнему должны знать о презентации, чтобы спросить данные. Так что я предпочитаю делать это в расширении ViewController
Все модуль должен выглядеть примерно так:
Вид
ViewController.h
extern NSString * const TableViewCellIdentifier;
@interface ViewController
@end
ViewController.m
NSString * const TableViewCellIdentifier = @"CellIdentifier";
@implemntation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self.presenter setupView];
}
- (void)refreshSongs {
[self.tableView reloadData];
}
@end
ViewController + TableViewDataSource.h
@interface ViewController (TableViewDataSource) <UITableViewDataSource>
@end
ViewController + TableViewDataSource.m
@implementation ItemsListViewController (TableViewDataSource)
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [self.presenter songsCount];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
Song *song = [self.presenter songAtIndex:[indexPath.row]];
// Configure cell
return cell;
}
@end
ViewController + TableViewDelegate.h
@interface ViewController (TableViewDelegate) <UITableViewDelegate>
@end
ViewController + TableViewDelegate.m
@implementation ItemsListViewController (TableViewDelegate)
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
Song *song = [self.presenter songAtIndex:[indexPath.row]];
[self.presenter didSelectItemAtIndex:indexPath.row];
}
@end
Выступающий
Presenter.m
@interface Presenter()
@property(nonatomic,strong)NSArray *songs;
@end
@implementation Presenter
- (void)setupView {
[self.interactor getSongs];
}
- (NSUInteger)songsCount {
return [self.songs count];
}
- (Song *)songAtIndex:(NSInteger)index {
return self.songs[index];
}
- (void)didLoadSongs:(NSArray *)songs {
self.songs = songs;
[self.userInterface refreshSongs];
}
@end
Interactor
Interactor.m
@implementation Presenter
- (void)getSongs {
[self.service getSongsWithCompletionHandler:^(NSArray *songs) {
[self.presenter didLoadSongs:songs];
}];
}
@end
Какой подход вы в конечном итоге взяли? –
@ Ríomhaire, на данный момент у меня есть экземпляры в моем презентаторе, которые вызвали tableViewDataSource и tableViewDelegate. –